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 "); 81 else 82 printf("%d ",ans); 83 } 84 }