题意
给出 N N N个点 M M M条边的图,要求每个点的度数不小于 k k k,求出最少还要连的边,不能有自环。
思路
我们求出除最大值外所有点还需的度数总和
s
u
m
sum
sum,以及一个点最大需要的度数
m
a
x
s
maxs
maxs,分两种情况讨论:
1、
m
a
x
s
>
s
u
m
maxs>sum
maxs>sum,答案为
m
a
x
s
maxs
maxs。因为这样我们可以让这个点和其他点连边,如果还需要连,我们就可以随便连。
2、否则答案为
⌈
(
s
u
m
+
m
a
x
s
)
2
⌉
\left \lceil \frac{(sum+maxs)}{2} \right \rceil
⌈2(sum+maxs)⌉,代表每两个点之间连一条边,可以给两个点同时增加两个度。如果第一种情况也按这样计算,就会出现最大的点向自己连的情况,不符合题目要求。
代码
#include<cstdio>
#include<algorithm>
int n, m, k, ans;
long long degree[100001];
int main() {
scanf("%d %d %d", &n, &m, &k);
for (int i = 1, x, y; i <= m; i++) {
scanf("%d %d", &x, &y);
degree[x]++;
degree[y]++;
}
long long sum = 0, maxs = 0;
for (int i = 1; i <= n; i++)
if (degree[i] <= k)
if (k - degree[i] <= maxs)
sum += k - degree[i];
else sum += maxs, maxs = k - degree[i];
if (maxs > sum)
printf("%d", maxs);
else printf("%lld", (sum + maxs + 1) / 2);
}