对于这题有个想法,望赐教
查看原帖
对于这题有个想法,望赐教
456675
a_sad_soul楼主2023/8/12 15:32

我想到做法是:设一个数组f[i][0/1]f[i][0/1]表示的是第ii个点取或者不取。先更新其关联点再更新其本身,最后在每个联通块取其最大的一个状态,累加到ansans中.输出ans.

#include<bits/stdc++.h>
using namespace std;
int mapp[1005][1005];
bool vis[1005];
long long f[1005][2];
int n,m;
long long maxx;
void dfs(int u)
{vis[u]=1;
	//cout<<1<<endl;
	f[u][1]=1;
	for(int i=1;i<=n;++i)
	{
		if(!vis[i]&&mapp[u][i])
		{
			dfs(i);
			f[u][0]+=max(f[i][0],f[i][1]);
			f[u][1]+=f[i][0];			
			
		}
	}
	maxx=max(maxx,max(f[u][0],f[u][1]));
	//cout<<u<<":"<<f[u][1]<<" "<<f[u][0]<<endl;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		mapp[a][b]=mapp[b][a]=1;
	}
	int ans=0;
	for(int i=0;i<n;++i)
	{
		maxx=0;
		if(!vis[i])dfs(i);	
		//cout<<maxx<<endl;
		ans+=maxx;
	}
	cout<<ans<<endl;
	return 0;
}

WAWA了三个点不知道是我思想问题还是代码问题,望大佬赐教.

2023/8/12 15:32
加载中...