欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

游乐场(图论)

程序员文章站 2023-12-27 08:24:39
...

游乐场

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

谢谢!

相关标签: dfs 图论

上一篇:

下一篇: