您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: