游乐场(图论)

博客讲述了Orz教主在太平洋中央建立的游乐园,其中包含多个小岛和游乐设施,小岛间由海底隧道连接。游客可以选择空投到任意小岛,游玩一次后不能再次空投。问题涉及求解czm能游览的最多游乐设施数量和fhn能得到的最大快乐值。输入包括小岛数量、费用和隧道信息,输出为czm的游览数量和fhn的快乐值。解题思路涉及最大连通分量和深度优先搜索算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游乐场

Description
据新闻报道,Orz教主在太平洋中央建了一个大游乐园,其中有许多小岛,每个小岛上有且仅有一个游乐设施,有的小岛与小岛之间有海底隧道连接,而有的没有,一个游乐设施对一个人只开放一次,花的钱与得到的快乐值成正比。一开始,你可以选择被空投到任意一个小岛。当你想离开游乐园时,你可以打电话叫飞机来接,但不能再次被空投。
fhn非常有钱,他想在游乐园里得到最大的快乐值
而czm则比较穷,他的愿望只是玩最多的游乐设施
Input
第一行: n (代表有n个小岛)(n<=200)
以下n行,依次表示使用小岛1–小岛n上的游乐设施所花的钱
e (代表有e条海底隧道)
接着e行,每行2个数,表示这两个小岛之间有海底隧道连接
Output
第一行,czm最多可以游览的游乐园的个数。
第二行,fhn的游览方式所得的快乐值。
Sample Input
5 //五个小岛
3
4
5
8
10
5 //五条海底隧道
1 2
1 3
2 5
3 4
4 5
Sample Output
5 //czm最多可以游览的游乐园的个数
30 //fhn的游览方式所得的快乐值

分析:有题意得:czm的要求可以用求最大连通分量!而快乐值想必大家都会,本蒟蒻用的是:”
dfs来做!
在这里插入图片描述

code:

#include<cstdio>
#include<iostream>
using namespace std;
int n,happy[300],e,head[300],t[40010],f[300],sum,sum2,w[300][300],ans2=0;
void dfs(int x)
{
	f[x]=1;  //标识该点走过
	sum+=happy[x];  //加上新的快乐值
	sum2++;  //可以游览的游乐园个数加一
	for(int i=1;i<=n;i++) //遍历
	{
		if(f[i]==0&&w[x][i]==1)  
		{
			f[i]=1;
			w[x][i]=0;
			dfs(i);
		}
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>happy[i];  //快乐值
	cin>>e;
	int a,b;
	for(int i=1;i<=e;i++)
	{
		cin>>a>>b;
		w[a][b]=1;  //无向图
		w[b][a]=1;
	}
	int ans1=0;
	for(int i=1;i<=n;i++)
	{
		if(f[i]==0) //判断这个点是否走过
		{
			sum=0;sum2=0;   //一。用来记录这个点的最大快乐值,二。用来记录这个点空投可以游览的游乐园的最多个数
			dfs(i);
			ans1=max(ans1,sum2); 
			ans2=max(ans2,sum);
		}
	}
	cout<<ans1<<endl;
	cout<<ans2<<endl;
	return 0;
} 

谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值