SPFA模板

19 篇文章 0 订阅
/*
 * Author       :  Echo
 * Email        :  1666424499@qq.com  
 * Description  :  SPFA 
 * Created Time :  2017/8/29 15:52:11
 * Last Modify  :  2017/8/29 18:48:09
 * File Name    :  SPFA.cpp
 */
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <time.h>
#define LL long long
#define mem(a,k) memset(a,k,sizeof(a))
using namespace std;
const int maxint = -1u>>1;
const int maxsize= 1100;
struct Edge{
    int to;
    int value;
    int next;
};
struct Graph{
    Edge an[maxsize*200];
    int cnt;
    int head[maxsize];
    int n,m;
    queue<int> q;
    bool vis[maxsize];
    int dis[maxsize];
    void clear(){
        memset(head,-1,sizeof(head)); 
    }
    void add(int u,int v,int value){
        an[cnt].to=v;
        an[cnt].value=value;
        an[cnt].next=head[u];
        head[u]=cnt++;
    }
    void spfa(int s){
        memset(vis,0,sizeof(vis));
        memset(dis,(1<<7)-1,sizeof(dis));
        while(!q.empty()){
            q.pop();
        }
        dis[s]=0;
        q.push(s);
        while(!q.empty()){
            int u=q.front();
            q.pop();
            vis[u]=0;
            for(int i=head[u];i!=-1;i=an[i].next){
                if(dis[an[i].to]>dis[u]+an[i].value){
                    dis[an[i].to]=dis[u]+an[i].value;
                    //printf("%d %d %d %d\n",u,dis[u],an[i].to,dis[an[i].to]);
                    if(!vis[an[i].to]){
                        vis[an[i].to]=1;
                        q.push(an[i].to);
                    }
                }
            }
        }
    }
}g;
int main() {
    int aim;
    g.clear();
    cin>>g.n>>g.m>>aim;
    for(int i=1;i<=g.m;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        g.add(a,b,c);
        //g.add(b,a,c);
    }
    int ans=0;
    int go[maxsize];
    for(int i=1;i<=g.n;i++){
        g.spfa(i);
        go[i]=g.dis[aim];
    }
    g.spfa(aim);
    for(int i=1;i<=g.n;i++){
        if(ans<g.dis[i]+go[i]){
            ans=g.dis[i]+go[i];
        }
        //cout<<g.dis[i]<<endl;
    }
    printf("%d\n",ans);
    return 0;
}
/*
4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3 


10


 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值