求出每条边两边有多少个点。

来源:互联网 发布:电脑桌面软件怎么变小 编辑:程序博客网 时间:2024/04/29 06:53

题目链接swjtu

Shortest Path

题解:只需要判断一条边两边的点数是否都为偶数,如果都为偶数,那么不加这条边,否则加上这条边。

关键,dfs一遍,求出每条边两边有多少个点。

#include<bits/stdc++.h>using namespace std;typedef pair<int,int>P;typedef long long ll;struct node{    int a,b,c,next;}edge[20010];int cnt;int head[10010];ll ans,res;int vis[10001],l[10001],r[10001],w[10001];void add(int a,int b,int c){    edge[cnt].b=b;    edge[cnt].c=c;    edge[cnt].next=head[a];    head[a]=cnt++;}int dfs(int u,int fa){    int summ=1;    for(int i=head[u];i!=-1;i=edge[i].next)    {        int sum=0;        node e=edge[i];        if(!vis[e.b])        {            vis[e.b]=1;            sum+=dfs(e.b,u);            if(sum%2)                ans+=e.c;            summ+=sum;        }    }    return summ;}int main(){    int t,a,b,c;    scanf("%d",&t);    while(t--)    {        memset(head,-1,sizeof(head));        int n;cnt=0;scanf("%d",&n);ans=0;        for(int i=1;i<n;i++)        {            scanf("%d%d%d",&a,&b,&c);            add(a,b,c);add(b,a,c);            l[i]=a,r[i]=b,w[i]=c;        }        memset(vis,0,sizeof(vis));        vis[1]=1;        dfs(1,-1);        printf("%lld\n",ans);    }    return 0;}


阅读全文
0 0
原创粉丝点击