#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue> using namespace std; #define MAX 100 struct Node{
int value;
struct Node* nextNode;
}; struct LGraph{
struct Node vertexs[MAX];
int ids[MAX];
int vexnum;
int edgenum;
} lg; void create_lg(){
int u,v;
int i;
struct Node *pi;
for(i = 0; i < lg.edgenum; i++){
scanf("%d%d", &u, &v);
u --; v --;
pi = (struct Node*)malloc(sizeof(struct Node));
pi->value = v;
pi->nextNode = lg.vertexs[u].nextNode;
lg.vertexs[u].nextNode = pi;
lg.ids[v] ++;
}
} void sort() {
int i;
int index = 0;
int count[MAX];
memset(count, 0, sizeof(count));
queue<int> Q;
for(i = 0; i < lg.vexnum; i++){
if(0 == lg.ids[i]){
Q.push(i);
}
}
while(!Q.empty()){
int node;
struct Node * pi;
struct Node * tmp;
node = Q.front();
count[index++] = node;
Q.pop();
pi = lg.vertexs[node].nextNode;
while(pi){
int v = pi->value;
lg.ids[v] --;
if(lg.ids[v] == 0) {
Q.push(v);
}
tmp = pi;
pi = pi->nextNode;
free(tmp);
lg.edgenum --;
}
}
if(index == lg.vexnum){
for(i = 0; i < index; i++){
if(i == 0){
printf("%d", count[i] + 1);
}
else{
printf(" %d", count[i] + 1);
}
}
printf("\n");
}
else{
printf("Network has a cycle!\n");
} } void delete_lg(){
int i;
struct Node * pi;
for( i = 0; i < lg.vexnum; i++){
pi = lg.vertexs[i].nextNode;
while(pi) {
pi = pi->nextNode;
free(pi);
}
}
} void init_lg(){
lg.vexnum = 0;
lg.edgenum = 0;
memset(lg.vertexs, 0, sizeof(lg.vertexs));
memset(lg.ids, 0, sizeof(lg.ids));
delete_lg();
} int N, M; int main() {
int i; while(1) {
scanf("%d%d", &N, &M);
if( 0 == N && 0 == M) {
break;
}
init_lg();
lg.vexnum = N;
lg.edgenum = M;
create_lg();
sort();
}
init_lg();
return 0;
}

假设输入文件中有向图的格式为:首先是顶点个数 n 和边数 m;然后是每条边,每条边的数
据占一行,格式为 u v,表示从顶点 u 到顶点 v 的一条有向边,顶点序号从 1 开始计起。输入文件
最后一行为 0 0,表示输入数据结束。
样例输入:

6 8
1 2
1 4
2 6
3 2
3 6
5 1
5 2
5 6
6 8
1 3
1 2
2 5
3 4
4 2
4 6
5 4
5 6
0 0

样例输出:

3 5 1 4 2 6
Network has a cycle!

[算法] aov图拓扑算法的更多相关文章

  1. java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...

  2. 算法:图(Graph)的遍历、最小生成树和拓扑排序

    背景 不同的数据结构有不同的用途,像:数组.链表.队列.栈多数是用来做为基本的工具使用,二叉树多用来作为已排序元素列表的存储,B 树用在存储中,本文介绍的 Graph 多数是为了解决现实问题(说到底, ...

  3. 【数据结构与算法Python版学习笔记】图——拓扑排序 Topological Sort

    概念 很多问题都可转化为图, 利用图算法解决 例如早餐吃薄煎饼的过程 制作松饼的难点在于知道先做哪一步.从图7-18可知,可以首先加热平底锅或者混合原材料.我们借助拓扑排序这种图算法来确定制作松饼的步 ...

  4. java数据结构_笔记(5)_图的算法

    图的算法 1 图的遍历图的遍历就是从图中某个顶点出发,按某种方法对图中所有顶点访问且仅访问一次.遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础. 2 深度优先遍历从图中某个顶点V 出发 ...

  5. GrabCut in One Cut(基于图割算法grabcut的一次快速图像分割的OpenCV实现)----目前效果最好的图割

     One cut in grabcut(grabcut算法的非迭代实现?) 本文针对交互式图像分割中的图割算法,主要想翻译一篇英文文献.不足之处请大家指正. 这是博主近期看到的效果最好,实现最简单 ...

  6. 基于GraphCuts图割算法的图像分割----OpenCV代码与实现

    转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/44151213, 来自:shiter编写程序的艺术 1.绪论 图切割算法是组合图论 ...

  7. 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法

    1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...

  8. 无向带权图的最小生成树算法——Prim及Kruskal算法思路

    边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...

  9. Geeks Union-Find Algorithm Union By Rank and Path Compression 图环算法

    相同是查找一个图是否有环的算法,可是这个算法非常牛逼,构造树的时候能够达到O(lgn)时间效率.n代表顶点数 原因是依据须要缩减了树的高度,也叫压缩路径(Path compression),名字非常高 ...

随机推荐

  1. 新手安装Oracle后的一些问题

      1.安装数据库服务端后,桌面上有个 打开之后点击一些按钮会叫你登录,用户名是SYSTEM,密码是安装的时候设置的密码(我设置的密码是root). . 2.在操作系统"运行"上输 ...

  2. $.data()、$().data

    两个方法很相似,但是有区别,简单说一下: $.data():jq的静态方法,也就是jQuery.data()直接调用 $().data():实例方法,先有实例,才能调用这个方法,例如:$(" ...

  3. 删除cygwin

    由于cygwin 学习了linux 的用户所有者的方式,要删除有一定困难. 所以要右击  然后点 获取管理员所有权  几分钟之后  就可以删了

  4. hh monitor

    http://theholyjava.wordpress.com/2012/09/21/enabling-jmx-monitoring-for-hadoop-and-hive/ http://blog ...

  5. ReactiveCocoa / RxSwift 笔记一

    原创:转载请注明出处 ReactiveCocoa / RxSwift Native app有很大一部分的时间是在等待事件发生,然后响应事件,比如 1.等待网络请求完成, 2.等待用户的操作, 3.等待 ...

  6. 锤子便签的 monkeyrunner 测试脚本(转)

    https://testerhome.com/topics/878 MonkeyRunner可能大家已经听过无数次了,大家在网上也看过了各种关于的它的资料了,我这里就不再过多的啰嗦它的用途了,它可以对 ...

  7. Android自动化测试之环境搭建

    Android自动化测试之环境搭建 一.Android-sdk介绍 SDK(Software development kit)软件开发工具包.被软件开发工程师用于为特定的软件包.软件框架.硬件平台. ...

  8. 初探JavaScript魅力(五)

    JS简易日历    innerHTML <title>无标题文档</title> <script> var neirong=['一','二','三','四','五' ...

  9. 更方便的函数回调——Lambda

    auto callbackFunc = [&](){ backHome(); }; []符号,表示要开始一个lambda函数: ()符号,里面填写函数的参数: 当想在lambda函数里使用外部 ...

  10. HDU 2672 god is a girl

    先找规律,发现是斐波那契数列...然后..水题.. #include<cstdio> #include<cstring> #include<cmath> #incl ...