首页 > 代码库 > 完美网络(优先队列实现)

完美网络(优先队列实现)

完美网络 

Time Limit: 1000MS Memory limit: 65536K

题目描述

完美网络是连通网络的基础上要求去掉网络上任意一条线路,网络仍然是连通网络。求一个连通网络要至少增加多少条边可以成为完美网络。

输入

第一行输入一个数T代表测试数据个数(T<=20)。每个测试数据第一行2个数n,m 分别代表网络基站数和基站间线路数。基站的序号为从1到n。接下来m行两个数代表x,y 代表基站x,y间有一条线路。
(0

输出

对于每个样例输出最少增加多少线路可以成为完美网络。每行输出一个结果。

示例输入

23 11 23 21 22 3

示例输出

21 

完美网络,只有图中每个点的度>=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]++;//输入一条边,同时使两顶点度加124             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 }

 

完美网络(优先队列实现)