zoukankan      html  css  js  c++  java
  • 牛客 Shortest Path (dfs+思维)

    非常巧妙的转换。首先我们可以观察性质,一条边不可能出现两次,因为显然可以被更好的方案替代

    之后,每个边就存在选或者不选两种情况

    如果以子树的节点为偶数,那么就不需要,否则需要,做一下dfs即可

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=3e5+10;
    const int mod=1e9+7;
    ll ans;
    int h[N],ne[N],e[N],idx,w[N];
    int cnt[N];
    void add(int a,int b,int c){
        e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
    }
    int dfs(int u,int fa){
        int i;
        cnt[u]=1;
        for(i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(j==fa)
                continue;
            cnt[u]+=dfs(j,u);
            if(cnt[j]%2){
                ans+=w[i];
            }
        }
        return cnt[u];
    }
    int main(){
        int t;
        cin>>t;
        while(t--){
            int n;
            cin>>n;
            int i;
            memset(cnt,0,sizeof cnt);
            memset(h,-1,sizeof h);
            idx=0;
            ans=0;
            for(i=1;i<n;i++){
                int a,b,c;
                scanf("%d%d%d",&a,&b,&c);
                add(a,b,c);
                add(b,a,c);
            }
            dfs(1,0);
            cout<<ans<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    10/11
    el表达式的坑
    在idea下两个项目之间的maven父子级项目依赖
    树上任意两点间距离
    优先级顺序
    HDU 6447
    KMP
    cf 1029 C
    牛客练习赛25
    莫比乌斯算法
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12864061.html
Copyright © 2011-2022 走看看