原题网址
题目描述
据新闻报道,
O
r
z
Orz
Orz教主在太平洋中央建了一个大游乐园,其中有许多小岛,每个小岛上有且仅有一个游乐设施,有的小岛与小岛之间有海底隧道连接,而有的没有,一个游乐设施对一个人只开放一次,花的钱与得到的快乐值成正比。一开始,你可以选择被空投到任意一个小岛。当你想离开游乐园时,你可以打电话叫飞机来接,但不能再次被空投。
f
h
n
fhn
fhn非常有钱,他想在游乐园里得到最大的快乐值。
而
c
z
m
czm
czm则比较穷,他的愿望只是玩最多的游乐设施。
格式
输入格式
第一行:
n
n
n(代表有
n
n
n个小岛)。
以下
n
n
n行,依次表示使用小岛
1
1
1至小岛
n
n
n上的游乐设施所花的钱。
下一行:
e
e
e (代表有
e
e
e条海底隧道)。
以下
e
e
e行,每行
2
2
2个数,表示这两个小岛之间有海底隧道连接。
输出格式
第一行,
c
z
m
czm
czm最多可以游览的游乐园的个数。
第二行,
f
h
n
fhn
fhn的游览方式所得的快乐值。
样例
输入样例
5
3
4
5
8
10
5
1 2
1 3
2 5
3 4
4 5
输出样例
5
30
提示
n ≤ 200 n\le200 n≤200
解题思路
在模板加点东西就好了。
此处使用
d
f
s
dfs
dfs+邻接矩阵。
Code
#include<iostream>
#include<istream>
#include<ostream>
#include<sstream>
#include<fstream>
#include<iomanip>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<map>
#include<vector>
#include<queue>
using namespace std;
const int maxn=200;
int n,m,s1,s2,ans1,ans2,g[maxn+5][maxn+5],a[maxn+5],v[maxn+5];
void dfs(int q) {
v[q]=1;
for(int i=1;i<=n;i++) {
if(!v[i]&&g[q][i]) {
s1++;
s2+=a[i];
dfs(i);
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cin>>m;
for(int i=1,x,y;i<=m;i++) {
cin>>x>>y;
g[x][y]=g[y][x]=1;
}
for(int i=1;i<=n;i++) {
if(!v[i]) {
s1=1;
s2=a[i];
dfs(i);
ans1=max(ans1,s1);
ans2=max(ans2,s2);
}
}
cout<<ans1<<endl<<ans2;
return 0;
}