题目描述
完美网络是连通网络的基础上要求去掉网络上任意一条线路,网络仍然是连通网络。求一个连通网络要至少增加多少条边可以成为完美网络。
题解:这个图它是一个无向连通图,当出现完美网络时,也就是每个节点的入度都大于或者等于二,也就是说至少有两条边连向同一个节点。
输入
第一行输入一个数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#include<iostream> #include<cstring> #include<queue> using namespace std; int main() { int T,in[10001],n,m,i,a,b; cin>>T; while(T--) { cin>>n>>m; priority_queue<int,vector<int>,greater<int> > qu;//我用优先队列储存度小于二的节点。 memset(in,0,sizeof(in)); for(i=1;i<=m;i++) { cin>>a>>b; in[a]++; in[b]++; } for(i=1;i<=n;i++) { if(in[i]<2) qu.push(in[i]); } int sum=0; while(!qu.empty()) { int key1=qu.top();//让两个度最小的出队列,然后加一,如果还小于二,再入队列。 qu.pop(); if(!qu.empty()) { int key2=qu.top(); qu.pop(); key1+=1; key2+=1; sum++; if(key1<2) qu.push(key1); if(key2<2) qu.push(key2); } else sum++;//<strong>这里应该注意,当队列只剩一个节点时,统计数应该加一,因为没有其他节点和它连接形成一条边了。</strong>
<strong>但是它的入度却小于二。</strong> } cout<<sum<<endl; } return 0; }
示例输出
2 1