spfa。。。。其实最好用floyed,最简单,只是很久没写spfa了,练习一下
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <cmath> using namespace std; int n , m , k , all; const int M = 1e5; int pre[M + 10] , other[M + 10] , last[M + 10] , cost[M + 10] , seq[M + 10]; int dis[M + 10] , Inque[M + 10]; void build(int x , int y , int z) { pre[++all] = last[x]; last[x] = all; other[all] = y; cost[all] = z; } int spfa(int s , int x) { memset(Inque , 0 , sizeof(Inque)); int head , tail , now , ed , dr; head = 1 , tail = 0; seq[++tail] = s; for(int i = 1 ; i <= n ; i++) dis[i] = 1 << 30; dis[s] = 0; Inque[s] = 1; while(head <= tail){ now = seq[head]; ed = last[now]; Inque[now] = 0; while(ed != -1){ dr = other[ed]; if(dis[now] + cost[ed] < dis[dr]){ dis[dr] = dis[now] + cost[ed]; if(!Inque[dr]){ Inque[dr] = 1; seq[++tail] = dr; } } ed = pre[ed]; } head++; } return dis[x]; } int main() { while(~scanf("%d %d %d",&n , &m , &k)){ memset(last , -1 , sizeof(last)); all = -1; for(int i = 1 ; i <= m ; i++){ int a , b , c; scanf("%d %d %d",&a , &b , &c); build(a , b , c); } int ans = 0; for(int i = 1 ; i <= n ; i++){ int tmp = 0; tmp += spfa(i,k); tmp += spfa(k,i); if(ans < tmp) ans = tmp; } printf("%d\n",ans); } return 0; }