输入格式
第一行:一个整数n, 表示起点+中转点+终点的数量,站点编号为(1-n),且起点的编号固定为1。(1<=n<=10000);
接下来n行,每行两个整数x, y。表示编号为x的站点拥有的宝藏数量为y。(1<=x<=n,1<= y <= 100000);
第n+2行:一个整数m, 表示路的数量(0<= m < n);
接下来m行,每行两个整数a, b;表示站点a到站点b存在一条路。
输出格式
一行:一个整数,表示小科最多可以获得的宝藏数量。
输入输出样例
输入样例1:
5 1 10 2 3 3 10 4 8 5 10 4 1 5 1 2 2 3 2 4
输出样例1:
21
解析:
1.
2.
3.
AC代码:
/*
*/
#include <bits/stdc++.h>
using namespace std;
const int N=10005,M=100005;
int money[N];
vector<int> t[N];
bool vis[M];
int n,m,ans;
void dfs(int r,int sum){
if(r==0) return ;
if(t[r].empty()){
ans=max(ans,sum+money[r]);
return ;
}
for(int i=0;i<t[r].size();i++){
int x=t[r][i];
if(!vis[money[x]]){
vis[money[x]] =true;
dfs(x,sum+money[r]);
vis[money[x]]=false;
}
}
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>n;
int x,y;
for(int i=1;i<=n;i++){
cin>>x>>y;
money[x]=y;
}
cin>>m;
for(int i=1;i<=m;i++){
cin>>x>>y;
t[x].push_back(y);
}
vis[money[1]] =true;
dfs(1,0);
cout<<ans;
return 0;
}