HDU3342Legal or Not 拓扑排序

  有向图判断是否成环  如果是环输出NO  

只要入度为0的点的个数 等于 总的点的个数则无环

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define LL long long
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define N  200
int in[N];
vector<int>edge[N];
int vis[N][N];

int main()
{
    int n,m;
    while(RII(n,m)==2&&n&&m)
    {
        while(m--)
        {
            int a,b;
            RII(a,b);
            if(!vis[a][b])
            {
            vis[a][b]=1;
            in[b]++;
            edge[a].push_back(b);
            }
        }
        queue<int>q;
        rep(i,0,n-1)
        if(!in[i])q.push(i);//后来还要取出来 所以这里cnt不用变
        int cnt=0;//计算入读为0的点
        while(!q.empty())
        {
            int u=q.front();q.pop();
            cnt++;
            if(edge[u].size())
            rep(i,0,edge[u].size()-1)
            {
                int v=edge[u][i];

                in[v]--;
                if(in[v]==0)q.push(v);
            }
        }
        if(cnt==n)printf("YES\n");
        else  printf("NO\n");
        CLR(vis,0);
        rep(i,0,n-1)
        in[i]=0,edge[i].clear();
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/bxd123/p/10558449.html
今日推荐