hdu 3342 Legal or Not 拓扑排序

题目链接

题意:给出n个点,m条有向边,判断是否有环。

拓扑排序,若还有点存在,却没有入度为0的点,则剩下的图有环。否则去点去边。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 110
using namespace std;

int mp[N][N],n,m,in[N];

int toposort()
{
    int k=0;
    while(k<n)
    {
        int flag=1;
        for(int i=0;i<n;i++)
        {
            if(in[i]==0)
            {
                in[i]--;
                k++;
                flag=0;
                for(int j=0;j<n;j++)
                    if(mp[i][j])    in[j]--;
            }
        }
        if(flag)    return 0;
    }
    return 1;
}

int main()
{
    while(~scanf("%d%d",&n,&m)&&n)
    {
        memset(mp,0,sizeof(mp));
        memset(in,0,sizeof(in));
        for(int i=0;i<m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            if(!mp[u][v])
                mp[u][v]=1,in[v]++;
        }
        if(toposort())  cout<<"YES"<<endl;
            else    cout<<"NO"<<endl;

    }
}

你可能感兴趣的:(ACM,图论,拓扑排序,HDU)