标签:des style blog io color os sp for 数据
2 3 1 1 2 3 2 1 2 2 3
2 1
完美网络,只有图中每个点的度>=2,此时才能保证任意删去一条边,图还是联通。
1 #include<iostream> 2 #include<algorithm> 3 #include<stdio.h> 4 #include<string.h> 5 #include<queue> 6 using namespace std; 7 8 int n,m; 9 int dg[10000100];//点的度 10 int main() 11 { 12 int T; 13 scanf("%d",&T); 14 while(T--) 15 { 16 priority_queue<int, vector<int>, greater<int> >que;//定义优先队列 17 memset(dg,0,sizeof(dg)); 18 scanf("%d %d", &n,&m); 19 int x,y; 20 for(int i=0;i<m;i++) 21 { 22 scanf("%d%d",&x,&y); 23 dg[x-1]++;//输入一条边,同时使两顶点度加1 24 dg[y-1]++; 25 } 26 sort(dg,dg+n);//排序,从小到大 27 28 for(int i=0;i<n;i++) 29 { 30 if(dg[i]<2)//把度小于2的点压入优先队列 31 que.push(dg[i]); 32 } 33 int cnt = 0;//需要加的边数 34 while(que.size()>=2) 35 { 36 int t = 0,f = 0; 37 t = que.top(); 38 que.pop(); 39 40 f = que.top(); 41 que.pop(); 42 43 ++t;//取出栈顶的两个元素,度分别加1, 44 ++f; 45 cnt++;//这样相当于加了一条边 46 if(t<2)//如果度加完后还是小于2,则下回优先考虑。 47 que.push(t); //放入优先队列 48 if(f<2) 49 que.push(f); 50 } 51 if(!que.empty())//如果执行完上述while循环后,队列还不为空 52 { //则这种情况只能说明,队列里还剩下一个元素,他的度仍小于2. 53 cnt = cnt + 1; 54 } 55 printf("%d\n", cnt); 56 } 57 return 0; 58 }
标签:des style blog io color os sp for 数据
原文地址:http://www.cnblogs.com/6bing/p/4123698.html