zzuli 1907: 小火山的宝藏收益 邻接表+DFS
邻接表+DFS
Submit: 113 Solved: 24
Description
Input
Output
对于每一组数据输出一个整数, 代表小火山能获得的最大钱数。
Sample Input
1 1
20
3 1
4 5 6
1 2
2 3
Sample Output
6
#include<cstdio> #include<stdio.h> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<string> #include<cstring> #include<vector> #include<queue> #define INF 0x3f3f3f3f #define MAX 100005 using namespace std; struct node { int u,v,w,next; }Map[MAX]; int a[MAX],k,n,s,vis[MAX]; long long val[MAX]; void Add(int u,int v) { Map[k].u=u; Map[k].v=v; Map[k].w=1; Map[k].next=a[u]; a[u]=k++; } long long DFS(int u) { int i,ok=0; long long sum=0; for(i=a[u];i!=-1;i=Map[i].next) { int v=Map[i].v; if(!vis[v]) { ok=1; vis[v]=1; sum+=DFS(v); //vis[v]=0; } } if(!ok) return val[u];//如果u能到达的点都被标记过,只能去u点的宝藏 return max(val[u],sum);//择优返回 } int main() { int T,i,u,v,w; scanf("%d",&T); while(T--) { k=1; for(i=0;i<MAX;i++) a[i]=-1; memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&s); for(i=1;i<=n;i++) scanf("%d",&val[i]); for(i=1;i<n;i++) { scanf("%d%d",&u,&v); Add(u,v); Add(v,u); } vis[s]=1; long long maxn=max(val[s],DFS(s)); printf("%lld\n",maxn); } return 0; }
View Code