SSL_1776 游乐场

题目:

        据新闻报道,Orz教主在太平洋中央建了一个大游乐园,其中有许多小岛,每个小岛上有且仅有一个游乐设施,有的小岛与小岛之间有海底隧道连接,而有的没有,一个游乐设施对一个人只开放一次,花的钱与得到的快乐值成正比。一开始,你可以选择被空投到任意一个小岛。当你想离开游乐园时,你可以打电话叫飞机来接,但不能再次被空投。 
fhn非常有钱,他想在游乐园里得到最大的快乐值。
而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);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值