NOI怎么会有这么水的题。。dfs维护一下size随便搞搞。。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#define N 1000005
#define ll long long
using namespace std;
struct edge{
int e,q,next;
}ed[N*2];
int n,s,e,q,ne=1,i,a[N],size[N];
ll ans;
void add(int s,int e,int q)
{
ed[++ne].e=e;ed[ne].q=q;
ed[ne].next=a[s];a[s]=ne;
}
void dfs(int x,int fa)
{
int to;
size[x]=1;
for (int j=a[x];j;j=ed[j].next)
if (ed[j].e!=fa)
{
to=ed[j].e;
dfs(to,x);
size[x]+=size[to];
ans+=(ll)ed[j].q*(ll)abs(n-2*size[to]);
}
}
int main()
{
scanf("%d",&n);
for (i=1;i<=n;i++) a[i]=0;
for (i=1;i<n;i++)
{
scanf("%d%d%d",&s,&e,&q);
add(s,e,q);add(e,s,q);
}
ans=0;
dfs(1,0);
cout<<ans;
}
本文分享了一道NOI竞赛中的简单题目,通过深度优先搜索(DFS)算法来解决。主要介绍了如何使用DFS遍历图并计算特定路径上的权值之和,涉及到图的存储结构及递归算法的应用。
933

被折叠的 条评论
为什么被折叠?



