第三个点本机输出都对,但交上去就错了。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e7 + 5;
int n, m, k;
struct Node{
int to, next;
}e[maxn];
int head[maxn], len;
void Insert(int u, int v){
e[++len].to = v; e[len].next = head[u]; head[u] = len;
}
int x, l, a[maxn], c[maxn], dis[maxn];
void dfs(int u){
if(dis[u] == 1) return;
dis[u] = 1; x++;
for(int i = head[u]; i; i = e[i].next){
int v = e[i].to;
dfs(v);
}
}
int dp[maxn];
void Solve(){
cin>>n>>m>>k; m *= 2;
if(k == 0) {cout<<m / 2<<endl; return;}
for(int i = 1; i <= k; ++i){
int u, v; cin>>u>>v;
Insert(u, v); Insert(v, u);
}
for(int i = 1; i <= n; ++i){
x = 0; dfs(i);
if(x != 0) a[++l] = c[l] = x;
}
for(int i = 1; i <= l; ++i){
for(int j = m; j >= a[i]; --j){
dp[j] = max(dp[j], dp[j - a[i]] + c[i]);
}
}
int ans = 1e9, minn = 1e9;
for(int i = 1; i <= m; ++i) if(minn > abs(dp[i] - m / 2)) minn = abs(dp[i] - m / 2), ans = dp[i];
if(ans == 1e9) cout<<"0"<<endl;
else cout<<ans<<endl;
}
int main(){
Solve();
return 0;
}
/*
5 3 3
1 2
2 3
3 4
4
*/
感谢大佬康康