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

浙公网安备 33010602011771号