dfs找出连通块 块内构造数据 bfs找出最值
如果有多个连通块 那max就为49 可以起点不同 这样记得修改后面的数据
写的老长了。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<queue> 8 using namespace std; 9 vector<int>ed[55]; 10 int vis[55],gg,p,g,maxz,o[55],pp[55][55],q[55]; 11 int w[55],mm[55]; 12 void dfs(int u) 13 { 14 gg++; 15 pp[g][gg] = u; 16 int i; 17 for(i = 0 ; i < (int)ed[u].size() ; i++) 18 { 19 int k = ed[u][i]; 20 if(!o[k]) 21 { 22 o[k] = 1; 23 dfs(k); 24 } 25 } 26 } 27 int bfs(int u,int k) 28 { 29 int i,tt=0; 30 for(i = 1; i <= q[k] ; i++) 31 { 32 vis[pp[k][i]] = 0; 33 } 34 queue<int>qq; 35 qq.push(u); 36 vis[u] = 1; 37 while(!qq.empty()) 38 { 39 int k = qq.front(); 40 tt = max(vis[k],tt); 41 qq.pop(); 42 for(i = 0 ; i < (int)ed[k].size() ; i++) 43 { 44 int v = ed[k][i]; 45 if(vis[v]>50) 46 return -1; 47 if(vis[v]&&abs(vis[v]-vis[k])!=1) 48 { 49 return -1; 50 } 51 if(!vis[v]) 52 { 53 vis[v] = vis[k]+1; 54 qq.push(v); 55 } 56 } 57 } 58 if(maxz<tt) 59 { 60 maxz = tt; 61 mm[k] = maxz; 62 for(i = 1; i <= q[k] ; i++) 63 { 64 w[pp[k][i]] = vis[pp[k][i]]; 65 } 66 } 67 return 1; 68 } 69 int main() 70 { 71 int n,i,j; 72 scanf("%d%d",&n,&p); 73 for(i = 1; i <= n ; i++) 74 { 75 int u,v; 76 scanf("%d%d",&u,&v); 77 ed[u].push_back(v); 78 ed[v].push_back(u); 79 } 80 g = 1; 81 for(i = 1; i <= p ; i++) 82 { 83 if(!o[i]) 84 { 85 o[i] =1; 86 dfs(i); 87 q[g] = gg; 88 gg=0;g++; 89 } 90 } 91 int nu=0; 92 for(i = 1; i < g ; i++) 93 { 94 int kk=0; 95 maxz=0; 96 for(j = 1; j <= q[i] ; j++) 97 { 98 if(bfs(pp[i][j],i)>0) 99 { 100 kk=1; 101 } 102 } 103 if(!kk) 104 { 105 maxz=0; 106 break; 107 } 108 } 109 if(maxz==0) 110 printf("-1 "); 111 else 112 { 113 if(g>2) 114 { 115 printf("49 "); 116 for(i = 1 ; i <= q[1] ; i++) 117 w[pp[1][i]]+=(50-mm[1]); 118 } 119 else 120 { 121 printf("%d ",maxz-1); 122 } 123 for(i = 1; i <= p ; i++) 124 printf("%d ",w[i]); 125 puts(""); 126 } 127 return 0; 128 }