完美网络
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description
完美网络是连通网络的基础上要求去掉网络上任意一条线路,网络仍然是连通网络。求一个连通网络要至少增加多少条边可以成为完美网络。
Input
第一行输入一个数T代表测试数据个数(T<=20)。每个测试数据第一行2个数n,m 分别代表网络基站数和基站间线路数。基站的序号为从1到n。接下来m行两个数代表x,y 代表基站x,y间有一条线路。
(0 < n < m < 10000)
Output
对于每个样例输出最少增加多少线路可以成为完美网络。每行输出一个结果。
Sample Input
2
3 1
1 2
3 2
1 2
2 3
Sample Output
2
1
Hint
Source
要成为完美网络,每个点的度数都至少是2,(减掉任意一条边的情况下依然满足联通);
把度数小于2的放进队列里,每次挑两个度数加一(相当于把这两点间连一条线),sum(增加的路线)++,
如果这两个点的度数已经>=2,跳出队列,否则继续在队列里操作;
当队列里的元素小于2时,不能再继续操作,判断队列里的元素是一个还是零个,一个sum++,零个说明都满足条件。
中国海洋大学第三届“朗讯杯”编程比赛高级组试题添加链接描述
/**/
#include<bits/stdc++.h>
using namespace std;
queue<int>q;
int du[10010];
int main()
{
int i,t,x,y,n,m,len,sum;
scanf("%d",&t);
while(t--)
{
len=0;
sum=0;
scanf("%d %d",&n,&m);
while(!q.empty())
{
q.pop();
}
memset(du,0,sizeof(du));
for(i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
du[x]++;
du[y]++;
}
for(i=1;i<=n;i++)
{
if(du[i]>=2)
continue;
else
{
len++;
q.push(i);
}
}
while(len>=2)
{
x=q.front();
q.pop();
y=q.front();
q.pop();
len-=2;
du[x]++;
du[y]++;
sum++;
if(du[x]<2)
{
len++;
q.push(x);
}
if(du[y]<2)
{
len++;
q.push(y);
}
}
if(len==1)//其他节点都凑对走了,如果还剩下一个,说明这个节点本来是孤立的节点,需要sum+1(可以自己画画试试)
{
sum++;
}
printf("%d\n",sum);
}
return 0;
}