hdu 3342(利用拓扑排序过程判断有向图是否有回路及自环)

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[N], flag;
struct node {
    int v;
    node *next;
    node(int vv, node *p) {
        v = vv;
        next = p;
    }
};
struct graph {
    node *link;
}G[N];

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;
}

 

posted on 2012-04-15 21:31  Try86  阅读(315)  评论(0编辑  收藏  举报