题目:
据新闻报道,Orz教主在太平洋中央建了一个大游乐园,其中有许多小岛,每个小岛上有且仅有一个游乐设施,有的小岛与小岛之间有海底隧道连接,而有的没有,一个游乐设施对一个人只开放一次,花的钱与得到的快乐值成正比。一开始,你可以选择被空投到任意一个小岛。当你想离开游乐园时,你可以打电话叫飞机来接,但不能再次被空投。
fhn非常有钱,他想在游乐园里得到最大的快乐值。
而czm则比较穷,他的愿望只是玩最多的游乐设施。
而czm则比较穷,他的愿望只是玩最多的游乐设施。
题意:
求一个图的最大连通分量和每个连通点的值的最大和。
思路:
用深搜遍历求最大连通分量和每个连通点的值的最大和就好了。
代码:
#include<cstdio>
int v[201],a[201],b[201][201],n,x,y,e,total,ans,oans,sao;
int max(int x,int y){return x>y?x:y;}
void dfs(int x)
{
ans=max(total,ans);
sao=max(oans,sao);
a[x]=1;
for (int i=1;i<=n;i++)
{
if (b[x][i]&&!a[i])
{
b[x][i]=0;b[i][x]=0;
a[i]=1;//以上是封路
total++;
oans=oans+v[i];//每次都统计连通分量和最大值
dfs(i);//从下一个点搜
}
}
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&v[i]);
scanf("%d",&e);
for (int i=1;i<=e;i++)
{
scanf("%d%d",&x,&y);
b[x][y]=1;
b[y][x]=1;
}
for (int i=1;i<=n;i++)
{
oans=v[i];total=1;
dfs(i);
}
printf("%d\n%d",ans,sao);
}