Shortest Path

Shortest Path

http://www.nowcoder.com/questionTerminal/f1d38ddf05124dc9898280431349fad9

其实我们画画图就可以发现,如果把边全部选完,那么一定是有解的。

所以,我们就是删除权值和最多的边,使得原问题还有解。什么是无解呢?就是某个边删除之后,连通块个数为奇数了,那么就不行。

所以直接dfs一次即可,如果当前子树点的个数为偶数个,直接删除即可。


AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10,M=N<<1;
int n,sz[N];    long long res;    int head[N],nex[M],to[M],w[M],tot;
inline void ade(int a,int b,int c){to[++tot]=b; nex[tot]=head[a]; w[tot]=c; head[a]=tot;}
inline void add(int a,int b,int c){ade(a,b,c);    ade(b,a,c);}
void dfs(int x,int fa){
    sz[x]=1;
    for(int i=head[x];i;i=nex[i])    if(to[i]!=fa){
        dfs(to[i],x);    if(sz[to[i]]%2==0)    res-=w[i];
        sz[x]+=sz[to[i]];
    }
}
inline void solve(){
    cin>>n;    tot=0; memset(head,0,sizeof head); res=0;
    for(int i=1,a,b,c;i<n;i++)    scanf("%d %d %d",&a,&b,&c),res+=c,add(a,b,c);
    dfs(1,1);    cout<<res<<endl;
}
signed main(){
    int T;    cin>>T;    while(T--)    solve();
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
转发
2 1 评论
分享
牛客网
牛客企业服务