题意很明确
让去构建一个完美网络,其实是要求每一个点,有两个点相连
1.水过的
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int dis[15000];
int main()
{
int n, t, m,i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i = 0; i <= n; i++)
dis[i] = 0;
for(i = 0; i < m; i++)
{
int u, v;
scanf("%d%d",&u,&v);
dis[u]++;
dis[v]++;
}
int ans = 0;
for(i = 1; i <= n; i++)
{
if(dis[i] < 2)
ans++;
}
printf("%d\n",(ans+1)/2);
}
return 0;
}
这个代码,有点问题,但是过了,看来数据很水啊
2.优先队列
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#define Maxn 10010
int dis[Maxn];
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
priority_queue<int,vector<int>,greater<int> > que;
int n, m;
scanf("%d%d",&n,&m);
for(int i = 0; i <= n; i++)
dis[i] = 0;
for(int i = 0; i < m; i++)
{
int u, v;
scanf("%d%d",&u,&v);
dis[u]++;
dis[v]++;
}
for(int i = 1; i <= n; i++)
que.push(dis[i]);
int ans = 0;
while(que.top()<2)
{
int x = que.top();
que.pop();
int y = que.top();
que.pop();
x++;
y++;
que.push(x);
que.push(y);
ans++;
}
printf("%d\n",ans);
}
return 0;
}