hdu 3342(利用拓扑排序过程判断有向图是否有回路及自环)
2012-04-15 21:31
459 查看
View Code
/* Name: 利用拓扑排序过程判断有向图是否有回路及自环 Copyright: Author: Try86 Date: 15/04/12 21:15 Description: */ #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> using namespace std; const int N = 105; int color , flag; struct node { int v; node *next; node(int vv, node *p) { v = vv; next = p; } }; struct graph { node *link; }G ; void init(int n) { for (int i=0; i<n; ++i) G[i].link = NULL; return ; } void buildG(int u, int v) { node *p = new node(v, G[u].link); G[u].link = p; return ; } void dfsVisit(int u) { color[u] = 1; for (node *p=G[u].link; p; p=p->next) { if (color[p->v] == 1) {//发现回路 flag = false; return ; } if (!color[p->v]) dfsVisit(p->v); } color[u] = 2; return ; } void topoSort(int n) { flag = true; memset(color, 0, sizeof(color)); for (int i=0; i<n; ++i) { if (!color[i]) { dfsVisit(i); if (!flag) return ; } } return ; } void del(node *p) { if (!p) return ; del(p->next); delete p; } int main() { int n, m; while (scanf("%d%d", &n, &m), n+m) { init(n); int u, v; for (int i=0; i<m; ++i) { scanf ("%d%d", &u, &v); buildG(u, v); } topoSort(n); if (flag) printf ("YES\n"); else printf ("NO\n"); for (int i=0; i<n; ++i) del(G[i].link); } return 0; }
相关文章推荐
- 答案错误!!!判断有向图是否存在回路,除了可以利用拓扑排序方法外,还可以利用()
- hdu 2647(拓扑排序,判断有向图是否存在回路及自环,并统计每个顶点的前驱点数)
- hdu 3342 Legal or Not(给一个有向图判断该图是否拓扑有序)
- 利用拓扑序列判断图中是否有环原理
- hdu_3342_拓扑排序判断是否有环
- [ACM] hdu 1217 Arbitrage (bellman_ford最短路,判断是否有正权回路或Floyed)
- (floyd 1.1)hdu 1217 Arbitrage(使用floyd来求最长路——判断是否存在一种货币,经过一个兑换回路以后>=1单元)
- Legal or Not (hdu 3342 拓扑排序判断是否成环)
- hdu 1272 小希的迷宫(并查集判断回路和是否连通)
- SDUT2140图结构练习——判断给定图是否存在合法拓扑序列
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- 数组排序及判断是否有重复项
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- 判断无向图是否有回路有四种方法
- JQuery 利用Ajax判断链接 是否有效
- sqlserver 各种判断是否存在(表名、函数、存储过程等)
- 利用ActionFilterAttribute来判断用户是否登陆等等
- sqlserver 各种判断是否存在(表名、函数、存储过程等)
- 判断N 数码是否有解 牛人总结 归并排序
- 判断数据是否存在,有返回值的存储过程