没想到可以用spfa
这个加源点和汇点的方式很关键。。。
#include<bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define sf scanf
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a));
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define MP make_pair
#define ULL unsigned long long
#define LL long long
#define inf 0x3f3f3f3f
#define md ((ll+rr)>>1)
#define ls (i<<1)
#define rs (ls|1)
#define eps 1e-5
#define N 200050
#define ree freopen("in.txt","r",stdin);
#define bug pf("----------------");
//2017年09月13日07:29:39
int n;
int a[N];
int inq[N];
int fst[N],vv[N<<1],nxt[N<<1],cost[N<<1],e;
int d[N];
void add(int u,int v,int c){
nxt[e]=fst[u];cost[e]=c;vv[e]=v;fst[u]=e++;
}
void spfa(){
mem(d,0);
queue<int>q;
d[0]=0;
q.push(0);
while(!q.empty()){
int u=q.front();q.pop();
inq[u]=0;
for(int i=fst[u];~i;i=nxt[i]){
int v=vv[i];
if(d[v]<d[u]+cost[i]){
d[v]=d[u]+cost[i];
if(!inq[v]){
inq[v]=1;q.push(v);
}
}
}
}
pf("%d\n",d[n+1]);
}
int main(){
int T;sf("%d",&T);
while(T--){
mem(fst,-1);e=0;
sf("%d",&n);
rep(i,1,n)sf("%d",&a[i]);
rep(i,1,n){
add(0,i,a[i]);
add(i,n+1,-a[i]);
}
rep(i,1,n-1){
int u,v,c;sf("%d%d%d",&u,&v,&c);
add(u,v,-c);
add(v,u,-c);
}
spfa();
}
}
本文介绍了一种使用SPFA算法解决特定图论问题的方法,并通过加入源点和汇点改进了算法流程。文中提供了完整的C++代码实现,展示了如何通过SPFA进行最短路径计算。
656

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



