先研究一下,感觉有点像lca里的树上前缀和,不过树有多颗,用color区分一下
https://www.luogu.com.cn/problem/P8779
cpp
#include<bits/stdc++.h>
using namespace std;
#define N 100011
typedef long long ll;
typedef pair<int,int> pii;
int n,k,m,cnt;
typedef struct edge
{
int v;
ll w;
}edge ;
vector<edge> mp[N];
int color[N];
ll pre_sum[N];///前缀和
void dfs(int u,ll d,int cnt)///树上前缀和的思路,color标记不同的树
{
pre_sum[u]=d;
color[u]=cnt;
for(auto a:mp[u])
{
int v=a.v;
ll w=a.w;
if(color[v]) continue;
dfs(v,d+w,cnt);
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>k;
for(int i=0;i<m;i++)
{
int u,v;
ll w;
cin>>u>>v>>w;
mp[u-1].push_back({v,w});///0-5时正的
mp[v].push_back({u-1,-1*w});///5-0是负的
}
for(int i=1;i<=n;i++)
{
if(!color[i])
{
dfs(i,0,++cnt); ///Color来标记和区分不同树
}
}
while(k--)
{
int l,r;
cin>>l>>r;
if(color[l-1]!=color[r]) cout<<"UNKNOWN"<<endl;///不在同一棵树
else
{
cout<<pre_sum[r]-pre_sum[l-1]<<endl;///区间和用树上前缀和来求
}
}
return 0;
}