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;
}