标签:
3 1 2 0 1 0 2 1 0 4 4 2 0 1 0 2 1 2 2 3 1 2 1 3 0 0 0
Case 1: zero one Case 2: two or more one
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 5010; 4 struct arc { 5 int u,v; 6 arc(int x = 0,int y = 0) { 7 u = x; 8 v = y; 9 } 10 }; 11 int low[maxn],dfn[maxn],bccno[maxn],clk,bcc_cnt; 12 vector<int>g[maxn],bcc[maxn],belong[maxn]; 13 stack<arc>stk; 14 void tarjan(int u,int fa) { 15 dfn[u] = low[u] = ++clk; 16 bool flag = false; 17 for(int i = g[u].size()-1; i >= 0; --i) { 18 if(!flag && g[u][i] == fa) { 19 flag = true; 20 continue; 21 } 22 if(!dfn[g[u][i]]) { 23 stk.push(arc(u,g[u][i])); 24 tarjan(g[u][i],u); 25 low[u] = min(low[u],low[g[u][i]]); 26 if(low[g[u][i]] >= dfn[u]) { 27 bcc[++bcc_cnt].clear(); 28 while(true) { 29 arc e = stk.top(); 30 stk.pop(); 31 if(bccno[e.u] != bcc_cnt) { 32 bccno[e.u] = bcc_cnt; 33 bcc[bcc_cnt].push_back(e.u); 34 belong[e.u].push_back(bcc_cnt); 35 } 36 if(bccno[e.v] != bcc_cnt) { 37 bccno[e.v] = bcc_cnt; 38 bcc[bcc_cnt].push_back(e.v); 39 belong[e.v].push_back(bcc_cnt); 40 } 41 if(e.u == u && e.v == g[u][i]) break; 42 } 43 } 44 } else if(dfn[g[u][i]] < dfn[u]) { 45 stk.push(arc(u,g[u][i])); 46 low[u] = min(low[u],dfn[g[u][i]]); 47 } 48 } 49 } 50 int uf[maxn]; 51 int Find(int x) { 52 if(x != uf[x]) uf[x] = Find(uf[x]); 53 return uf[x]; 54 } 55 void init() { 56 for(int i = clk = bcc_cnt = 0; i < maxn; ++i) { 57 bccno[i] = dfn[i] = 0; 58 g[i].clear(); 59 belong[i].clear(); 60 uf[i] = i; 61 } 62 while(!stk.empty()) stk.pop(); 63 } 64 int main() { 65 int n,m,q,u,v,cs = 1; 66 while(scanf("%d%d%d",&n,&m,&q),n||m||q) { 67 init(); 68 for(int i = 0; i < m; ++i) { 69 scanf("%d%d",&u,&v); 70 g[u].push_back(v); 71 g[v].push_back(u); 72 u = Find(u); 73 v = Find(v); 74 if(u != v) uf[v] = u; 75 } 76 for(int i = 0; i < n; ++i) 77 if(!dfn[i]) tarjan(i,-1); 78 printf("Case %d:\n",cs++); 79 while(q--) { 80 scanf("%d%d",&u,&v); 81 if(Find(u) != Find(v)) puts("zero"); 82 else { 83 bool flag = false; 84 for(auto &a:belong[u]) 85 for(auto &b:belong[v]) 86 if(a == b && bcc[a].size() > 2) 87 flag = true; 88 puts(flag?"two or more":"one"); 89 } 90 } 91 } 92 return 0; 93 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4762236.html