hdu 3342 Legal or Not

拓扑排序找环模题,如果一次排序所有点不能全部删除则有环,因为环的所有点入度为1。

 

 

 

#include <bits/stdc++.h>
#include <unordered_set>
#include <unordered_map>
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define rep(i,x,y) for(i=x;i<=y;i++)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define up rt,rt<<1,rt<<1|1
#define mem(x) memset(x,0,sizeof(x))
#define mem1(x) memset(x,-1,sizeof(x))
#define LMissher
using namespace std;
typedef long long ll;
typedef double db;
const int M = 1e3+7;
const double pi = acos(-1);
const int inf = 2147483647;
const int mod = 1e9+7;

int n,m,i,tmp;
int deg[M],in[M];
vector<int> g[M];
queue<int> q;

void solve(){
    while(!q.empty()){
        int u=q.front();q.pop();
        if(in[u]) continue;
        in[u]=1;tmp--;
        for(auto v : g[u] ){
            deg[v]--;
            if(deg[v]==0) q.push(v);
        }
    }
}

int main(){
    #ifdef LMissher
        freopen("1.in","r",stdin);
        freopen("1.out","w",stdout);
    #endif
    while(~scanf("%d%d",&n,&m)){
        if(n==0) break;
        for(int i=1;i<=n;i++) g[i].clear();mem(deg);
        for(int i=1;i<=m;i++){
            int u,v;
            scanf("%d%d",&u,&v);u++;v++;
            deg[v]++;
            g[u].pb(v);
        }
        mem(in);while(!q.empty()) q.pop();tmp=n;
        rep(i,1,n) if(deg[i]==0) q.push(i);
        solve();
        if(tmp==0) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
View Code

 

posted @ 2018-09-04 14:23  LMissher  阅读(107)  评论(0)    收藏  举报