HDU 6201 transaction transaction transaction (2017沈阳网络赛 - spfa最长路)

本文介绍了一种使用SPFA算法解决特定图论问题的方法,并通过加入源点和汇点改进了算法流程。文中提供了完整的C++代码实现,展示了如何通过SPFA进行最短路径计算。

没想到可以用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月1307: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();
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值