Mining Your Own Business UVALive - 5135(点双联通分量)
these days I‘m tired!,but very happy。。。
#include<cstdio> #include<cstring> #include<stack> #include<vector> #include<algorithm> using namespace std; typedef long long lld; const int MAXN = 50005<<1; struct Edge { int u,v; }; vector <int> G[MAXN],bcc[MAXN]; stack <Edge> S; int pre[MAXN],is_cut[MAXN],bccno[MAXN]; int bcc_cnt,dfs_clock; int dfs(int u,int fa) { int low_u = pre[u] = ++dfs_clock; int child = 0; for(int i = 0;i < G[u].size();i++) { int v = G[u][i]; Edge e = (Edge){u,v}; if(!pre[v]) { child++; S.push(e); int low_v = dfs(v,u); low_u = min(low_u,low_v); if(low_v >= pre[u]) { is_cut[u] = 1; bcc_cnt++; bcc[bcc_cnt].clear(); for(;;) { Edge x = S.top(); S.pop(); if(bccno[x.u] != bcc_cnt) { bcc[bcc_cnt].push_back(x.u); bccno[x.u] = bcc_cnt; } if(bccno[x.v] != bcc_cnt) { bcc[bcc_cnt].push_back(x.v); bccno[x.v] = bcc_cnt; } if(x.u == u && x.v == v) break; } } } else if(pre[v] < pre[u] && v != fa) { S.push(e); low_u = min(low_u,pre[v]); } } if(child == 1 && fa == -1) is_cut[u] = 0; return low_u; } void find_bcc(int n) { memset(pre,0,sizeof(pre)); memset(is_cut,0,sizeof(is_cut)); memset(bccno,0,sizeof(bccno)); dfs_clock = bcc_cnt = 0; for(int i = 0;i < n;i++) if(!pre[i]) dfs(i,-1); } int main() { int cas = 0; int n; while(~scanf("%d",&n) && n) { for(int i = 0;i < 2*n;i++) G[i].clear(); int max_id = 0; for(int i = 0;i < n;i++) { int a,b; scanf("%d%d",&a,&b); max_id = max(max_id,a); max_id = max(max_id,b); a--;b--; G[a].push_back(b); G[b].push_back(a); } find_bcc(max_id); //printf("bcc_cnt = %d\n",bcc_cnt); int ans_num = 0; lld ans_count = 1; if(bcc_cnt == 1) { ans_num = 2; ans_count = (lld)bcc[1].size()*(bcc[1].size()-1)/2; } else { for(int i = 1;i <= bcc_cnt;i++) { int cc = 0; for(int j = 0;j < bcc[i].size();j++) if(is_cut[bcc[i][j]] == 1) cc++; if(cc == 1) { ans_num++; ans_count *= bcc[i].size()-1; } } } printf("Case %d: %d %lld\n",++cas,ans_num,ans_count); } return 0; }
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。