判断有向图是否有环

来源:互联网 发布:网络转换地址优缺点 编辑:程序博客网 时间:2024/06/10 02:49

输入一个有向图,判断该图是否有环

1.测试数据较小, 可用二维数组记录边, 深搜

int x,y,n,m,a[105][105];int v[105],flag;void dfs(int i){     if(v[i]==1){  //已访问过        flag=0; return;    }    v[i]=1;  //正在访问    for(int j=1; j<=n&&flag;j++)        if(a[i][j]) dfs(j);    v[i]=2;  //访问结束}int main(){    flag=1;    scanf("%d %d",&n,&m);    for(int i=0;i<m;i++){        scanf("%d %d",&x,&y);        a[x][y]=1;    }    for(int i=1;i<=n;i++)        if(!v[i]) dfs(i);    printf("%d\n",flag); //1为有环    return 0;}

2.测试数据较大,拓扑排序

(入度为0就放入数组, 再将邻接点入度减1,为0再放入数组)

int into[100009];vector<int> g[100009];bool topo(int n) {    int a[100009], k = 0;    for (int i=1; i<=n; i++) {       if(into[i]==0) a[k++]=i;    }    for (int i=0; i<k; i++) {        int u = a[i];        int size = g[u].size();        for (int j = 0; j < size; j++) {            into[g[u][j]]--;            if(into[g[u][j]]==0) a[k++] = g[u][j];        }    }    return (n==k);}     int main() {    int t,n,m,u,v;    cin >> t;    while(t--) {        cin >> n >> m;        memset(into, 0, sizeof(into));        for (int i = 0; i < n+10; i++)           while(!g[i].empty())  g[i].pop_back();        for (int i = 0; i < m; i++) {            cin >> u >> v;            g[u].push_back(v);            into[v]++;        }        if (topo(n))  cout << "无环" << endl;        else cout << "有环" << endl;}return 0;}   




0 0
原创粉丝点击