完美网络
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; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-12-28 16:48:11