游乐场(图论)

核能气质少年 提交于 2019-12-20 23:16:40

游乐场

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;
} 

谢谢!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!