我想到做法是:设一个数组f[i][0/1]表示的是第i个点取或者不取。先更新其关联点再更新其本身,最后在每个联通块取其最大的一个状态,累加到ans中.输出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;
}
WA了三个点不知道是我思想问题还是代码问题,望大佬赐教.