题目地址:https://vjudge.net/contest/66569#problem/D
思路:先将各个点作为起点,各跑一次迪杰斯特拉,然后以x点为起点跑一边迪杰斯特拉。
AC代码:
#include<iostream> #include<cstdio> #include<queue> #include<vector> #include<cstring> using namespace std; const int maxn=1000+5; vector<pair<int,int> >E[maxn]; int d[maxn]; int n,m,x; int ans[maxn]; void dij(int s) { for(int i=0;i<=n;i++) { d[i]=1e9; } d[s]=0; priority_queue<pair<int,int> >q; q.push(make_pair(-d[s],s)); while(!q.empty()) { int now=q.top().second; q.pop(); for(int i=0;i<E[now].size();i++) { int v=E[now][i].first; if(d[v]>d[now]+E[now][i].second) { d[v]=E[now][i].second+d[now]; q.push(make_pair(-d[v],v)); } } } } int main() { scanf("%d%d%d",&n,&m,&x); for(int i=0;i<m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); E[a].push_back(make_pair(b,c)); } for(int i=1;i<=n;i++) ans[i]=0; for(int i=1;i<=n;i++) { dij(i); ans[i]+=d[x]; } dij(x); int max=-1; for(int i=1;i<=n;i++) { ans[i]+=d[i]; if(ans[i]>max) max=ans[i]; } printf("%d\n",max); }