完美网络(优先队列)
2015-07-31 08:13
369 查看
完美网络
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
完美网络是连通网络的基础上要求去掉网络上任意一条线路,网络仍然是连通网络。求一个连通网络要至少增加多少条边可以成为完美网络。输入
第一行输入一个数T代表测试数据个数(T<=20)。每个测试数据第一行2个数n,m 分别代表网络基站数和基站间线路数。基站的序号为从1到n。接下来m行两个数代表x,y 代表基站x,y间有一条线路。(0 < n < m < 10000)
输出
对于每个样例输出最少增加多少线路可以成为完美网络。每行输出一个结果。示例输入
2 3 1 1 2 3 2 1 2 2 3
示例输出
2 1
提示
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<iostream> using namespace std; int du[1000001]; int main() { int T; cin>>T; while(T--) { memset(du,0,sizeof(du)); int n,m; cin>>n>>m; for(int i=0;i<m;i++) { int x,y; cin>>x>>y; du[x]++; //每个节点的入度数先加1 du[y]++; } priority_queue<int ,vector<int>,greater<int> >x; //构造优先队列 //优先队列 int count=0; for(int i=1;i<=n;i++) { if(du[i]<2) //只要是入度数小于2的就压进队列中,因为如果要构成完美图 //,那么每个节点的入度数要大于等于2 { x.push(du[i]); } } while(x.size()>=2) { int t1=x.top(); //从队列中取出两个元素,因为一条边连接两个顶点 x.pop(); int t2=x.top(); x.pop(); t1++; t2++; count++; if(t1<2) //如果该节点的入度数还是小于2,继续压进队列 { x.push(t1); } if(t2<2) { x.push(t2); } } if(!x.empty())//如果队列中还剩余一个节点,那么条数也要加1 count++; cout<<count<<endl; } }
相关文章推荐
- [转载] 读《UNIX网络编程 卷1:套接字联网API》
- Demo XML 、 JSON 解析 AND 网络HTTP请求
- HttpClient结合Struts2开发移动应用后台
- Https要点
- 教育信息化推动变革 促进公平
- PHP获取当前域名$_SERVER['HTTP_HOST']和$_SERVER['SERVER_NA
- 解决Expected MultipartHttpServletRequest: is a Multi
- Linux Tcp客户端和服务器端代码实现
- http请求
- hdu 4023 2011上海赛区网络赛C 贪心+模拟
- C# http
- iOS后台播放网络音乐
- 会话cookie中缺少HttpOnly属性 解决
- 阿里笔试题之Android网络优化
- OGG-01031 由于网络中断导致datapump进程ABENDED的恢复方法
- 黑马程序员——网络编程
- 来谈谈网络安全,关于Session冒名顶替和cookie防篡改的问题
- Android网络传输中必用的两个加密算法:MD5 和 RSA
- Unix网络编程-----阅读笔记(1)
- Android5.0以上系统的移动网络开关