Information

zoj3630:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3630

题意:给你一张图,然后让你选择一个点,并且删除它,让图的最大连通分量最小。

题解:模板题。枚举每个点,然后求最大的连通分量。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=106;
 7 int ans,counts,n,m;
 8 int map1[N][N],map2[N][N],map3[N][N],map4[N][N];
 9 int que[N],tail;
10 bool used[N],flag;
11 void init(){
12   tail=0;
13   memset(map1,0,sizeof(map1));
14   memset(map2,0,sizeof(map2));
15   memset(map3,0,sizeof(map3));
16   memset(map4,0,sizeof(map4));
17 }
18 void DFS0(int u){
19     if(used[u])return;
20     used[u]=true;
21     for(int i=0;i<n;i++)
22       if(map1[u][i])
23         DFS0(i);
24         que[++tail]=u;
25 }
26 void DFS1(int u){
27     if(used[u])return;
28     used[u]=true;
29     flag=true;
30     for(int i=0;i<n;i++)
31        if(map2[u][i])
32         DFS1(i);
33     counts++;
34 }
35 int  solve(){
36     tail=0;
37     int ans2=0;
38     memset(used,0,sizeof(used));
39     for(int i=0;i<n;i++)
40         DFS0(i);
41     memset(used,0,sizeof(used));
42     while(tail){
43         flag=false;
44         counts=0;
45         DFS1(que[tail--]);//从队列中弹出元素
46         if(flag){
47            ans2=max(ans2,counts);
48           }
49       }
50  return ans2;
51 }
52 void copy(){
53     for(int i=0;i<n;i++){
54       for(int j=0;j<n;j++){
55           map1[i][j]=map3[i][j];
56           map2[i][j]=map4[i][j];         
57          }        
58     }    
59 }
60 int main(){
61     int u,v;
62     while(~scanf("%d%d",&n,&m)){
63          init();
64       for(int i=1;i<=m;i++){
65         scanf("%d%d",&u,&v);
66            map1[u][v]=1;
67            map2[v][u]=1;
68            map3[u][v]=1;
69            map4[v][u]=1;
70       }
71       ans=1000000;
72       for(int i=0;i<n;i++){
73              copy();
74             for(int j=0;j<n;j++){
75                   map1[i][j]=map1[j][i]=0;
76                   map2[j][i]=map2[i][j]=0;         
77             }
78             ans=min(ans,solve());
79       }
80       if(ans<=1)printf("0\n");
81       else 
82        printf("%d\n",ans);
83     }
84 }
View Code

 

posted on 2014-07-12 07:48  天依蓝  阅读(209)  评论(0编辑  收藏  举报

导航