【POJ】1935 Journey(树形dp)
题目
传送门: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 */