游乐场(图论)
程序员文章站
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;
}