1. 程式人生 > >【POJ】1935 Journey(樹形dp)

【POJ】1935 Journey(樹形dp)

scan AR urn vector 答案 span ace CA include

題目

傳送門:QWQ

分析

涼涼。

答案是所有要經過的點到根所經過的邊權和減去最大的邊權。

代碼

vector好慢啊

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=105000;
int d[maxn], fa[maxn];
struct Edge{int u,v,dis;};
vector<int> G[maxn];vector<Edge> edges;
int n, ans; int val[maxn], vis[maxn]; void Addedge(int u,int v,int dis){ edges.push_back((Edge){u,v,dis});edges.push_back((Edge){v,u,dis}); int m=edges.size()-1;G[u].push_back(m-1);G[v].push_back(m); } int dfs(int x,int f,int depth){ fa[x]=f; d[x]=depth; for(int i=0;i<G[x].size();i++){ Edge v
=edges[G[x][i]]; if(v.v==f) continue; dfs(v.v,x,depth+v.dis); if(vis[v.v]) vis[x]=1,ans+=edges[G[x][i]].dis*2; } } int main(){ int n,k,a,b,c; scanf("%d%d",&n,&k); for(int i=0;i<n-1;i++){ scanf("%d%d%d",&a,&b,&c); Addedge(a,b,c); }
int m; scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%d",&val[i]); vis[val[i]]=1; } dfs(k,0,0); int maxnum=0; for(int i=1;i<=n;i++){ if(vis[i]) maxnum=max(maxnum,d[i]); } printf("%d",ans- maxnum); return 0; } /* 4 2 1 2 1 4 2 2 2 3 3 1 1 */

【POJ】1935 Journey(樹形dp)