XDU 1278
来源:互联网 发布:土耳其航空 知乎 编辑:程序博客网 时间:2024/06/07 07:13
求出割点后枚举 ,两两相乘# include<cstdio># include<vector># define maxn 1005using namespace std;vector<int> G[maxn];int total;int pre[maxn],iscut[maxn],dfs_clock,vis[maxn],N,num[maxn];int dfs(int u,int f){ int lowu=pre[u]=++dfs_clock; int child=0; for(int i=0;i<G[u].size();i++) { int v=G[u][i]; if(!pre[v]) { child++;////// int lowv=dfs(v,u); lowu=min(lowu,lowv); if(lowv>=pre[u]) iscut[u]=1; } else if(v!=f&&pre[v]<pre[u]) lowu=min(pre[v],lowu); } if(f<0&&child==1) iscut[u]=0; return lowu;}int ddfs(int u){ total++; vis[u]=1; for(int i=0;i<G[u].size();i++) if(!vis[G[u][i]]) ddfs(G[u][i]);}int Dfs(int u){ for(int i=1;i<=N;i++) vis[i]=0; vis[u]=1; int top=0,sum=0; for(int i=0;i<G[u].size();i++) if(!vis[G[u][i]]) { total=0; ddfs(G[u][i]); num[top++]=total; } for(int i=0;i<top;i++) for(int j=i+1;j<top;j++) sum+=num[i]*num[j]; return sum;}int main(){ int a,b,tag=0,kase=0; while(1) { kase++; N=0; for(int i=1;i<=maxn;i++) { G[i].clear(); pre[i]=0; iscut[i]=0; } dfs_clock=0; while(1) { scanf("%d",&a); if(a==0) { tag++; break; } tag=0; scanf("%d",&b); if(a>N) N=a; if(b>N) N=b; G[a].push_back(b); G[b].push_back(a); } if(tag==2) break; dfs(1,-1); int max=0,flag=0; for(int i=1;i<=N;i++) if(iscut[i]) { int temp=Dfs(i); // printf("iscut=%d\n",i); if(temp>max) { max=temp; flag=i; } } if(flag==0) { flag=1; max=0; } printf("Case %d: kill %d to break %d connections\n",kase,flag,max); } return 0;}