完美网络
Time Limit: 1000 ms Memory Limit: 65536 KiB
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,那么我们就从这里开始入手。用一个数组来存点的入度,当入度为 1 时每两个点能凑‘一对’,存在多一个的情况,这个时候我们也得给它凑对所以sum也要加 1 。入度为 0 的时候每一个点都要凑对两次。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int a[10010];
int sum;
int t, n, m, i;
scanf("%d", &t);
while(t--)
{
memset(a, 0, sizeof(a));
scanf("%d%d", &n, &m);
int u, v;
for(i = 1; i <= m; i++)
{
scanf("%d%d", &u, &v);
a[u]++;
a[v]++;
}
int k1 = 0, k0 = 0;
for(i = 1; i <= n; i++)
{
if(a[i] == 0)
k0++;
else if(a[i] == 1)
k1++;
}
sum = k0 + k1 / 2 + k1 % 2; // 直接加就ok了
printf("%d\n", sum);
}
return 0;
}