zoukankan      html  css  js  c++  java
  • 【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
    */
  • 相关阅读:
    NIO学习
    XML(二)
    IO和NIO
    Log4j
    异常处理机制
    XML
    数据交互
    分页实现的三种方式
    Idea破解
    数据库连接池
  • 原文地址:https://www.cnblogs.com/noblex/p/9245476.html
Copyright © 2011-2022 走看看