/*
* 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
*/
SPFA模板
最新推荐文章于 2022-03-15 20:57:13 发布