第一遍dijkstar(求终点到起点的最短路)
第二遍dijkstra 权值反转(把mp[i][j]和mp[j][i]交换)(求各起点到终点的最短路)
水水水水水~~~~~
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int ans[1005],dis[1005],mp[1005][1005],n,m,en,a,b,len;
bool sym[1005];
void dijkstra()
{
memset(sym,0,sizeof(sym));
for(int i=1;i<=n;i++)
dis[i] = 999999999;
sym[en] = 1;
dis[en] = 0;
int pre = en;
for(int i=1;i<=n;i++)
if(!sym[i]&&dis[i]>dis[pre]+mp[pre][i])dis[i] = dis[pre]+mp[pre][i];
for(int i=2;i<=n;i++)
{
int ma = 999999999;
for(int j=1;j<=n;j++)
if(!sym[j]&&dis[j]<ma)
{
pre = j;
ma =dis[j];
}
sym[pre] = 1;
for(int j=1;j<=n;j++)
if(!sym[j]&&dis[j]>dis[pre]+mp[pre][j])dis[j] = dis[pre]+mp[pre][j];
}
for(int i=1;i<=n;i++)
ans[i]+=dis[i];
}
int main()
{
while(scanf("%d%d%d",&n,&m,&en)!=EOF)
{
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mp[i][j] = 999999999;
while(m--)
{
scanf("%d%d%d",&a,&b,&len);
if(mp[a][b]>len)mp[a][b] = len;
}
dijkstra();
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
int t = mp[i][j];
mp[i][j] = mp[j][i];
mp[j][i] = t;
}
dijkstra();
int ans1 = 0;
for(int i=1;i<=n;i++)
ans1 = max(ans1,ans[i]);
printf("%d\n",ans1);
}
return 0;
}