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
















原创粉丝点击