63pts求助!!!
  • 板块P2170 选学霸
  • 楼主WAI_kycm
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/3/10 16:05
  • 上次更新2023/10/23 22:02:14
查看原帖
63pts求助!!!
544458
WAI_kycm楼主2023/3/10 16:05

第三个点本机输出都对,但交上去就错了。

#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
*/

感谢大佬康康

2023/3/10 16:05
加载中...