时间限制(普通/Java) : 3000 MS/ 9000 MS 运行内存限制 : 65536 KByte
总提交 : 15 测试通过 : 1
比赛描述
oo喜欢和同学一起去宇宙中探索未知的事物。这天他发现宇宙中有双向虫洞和单向虫洞,可以传送到其他的星球上,但是因为虫洞十分不稳定,使用一次之后便会消失,现在他已经知道了所有虫洞所在的星球,他想知道他能不能选择一个星球,从这个星球出发并且最后回到这个星球。
输入
第一行一个整数T,表示case的个数(T<=15)。对于每个case,第一行三个整数,n,m1,m2(1<=n,m1,m2<=100000),接下来m1行,每行两个整数u,v,表示一个双向虫洞连接u,v。接下来m2行,表示一个单向虫洞从u到v。
输出
对每个case,如果oo可以,则输出YES,如果不能,输出NO。
样例输入
1
2
5 2 1
1 2
1 2
4 5
样例输出
YES
这题判断两次环,一次是只能走一次的无向图,一次是有向图
/* ID: oodt PROG: LANG:C++ */ #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<string> #include<cstring> #include<map> #include<vector> #include<queue> #include<stack> #include<set> using namespace std; const int maxx=1000500; int n,m,k; int a[maxx]; int ans = 0,cnt = 0,pos = 0; int l = 0,r = 0; int m1,m2; vector<int> G[maxx]; int par[maxx]; int in[maxx]; int ve[maxx]; priority_queue<int> q; void init(){ for(int i = 1; i <= n; i++) { G[i].clear(); par[i] = i; } memset(in,0,sizeof(in)); while(!q.empty()) q.pop(); // ve.clear(); memset(ve,0,sizeof(ve)); } int find(int x){ if(x == par[x]) return x; return par[x] = find(par[x]); } void tp(int n) { for(int i = 1; i <= n; i++) { if(in[i] == 0) q.push(i); } k = 0; while(!q.empty()){ int v = q.top(); q.pop(); //ve.push_back(v); // ve[v] = k--; k++; for(int i = 0; i < G[v].size(); i++) { int t = G[v][i]; in[t]--; if(!in[t]) q.push(t); } } } int main() { #ifdef LOCAL freopen("/Users/ecooodt/Desktop/c++ and acm/_闆嗚2/talk_3/e/1.in","r",stdin); freopen("/Users/ecooodt/Desktop/c++ and acm/_闆嗚2/talk_3/e/1.out","w",stdout); #endif int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m1,&m2); init(); int fk = 0; for(int i = 0; i < m1; i++) { int u,v; scanf("%d%d",&u,&v); int fu = find(u); int fv = find(v); if(fu == fv){ fk = 1; // break; } else{ par[fv] = fu; } } for(int i = 0; i < m2; i++) { int u,v; scanf("%d%d",&u,&v); int fu = find(u); int fv = find(v); if(fu == fv){ fk = 1; //break; } else{ G[fu].push_back(fv); in[fv]++; } } if(fk) { printf("YES\n"); continue; } tp(n); if(k == n) { printf("NO\n"); } else printf("YES\n"); } return 0; }