#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int INF=99999999;
int maps[2005][2005],v[2005],d[2005],d1[2005];
int n, m, x;
int Dijkstra( )
{
int i,j,k,mini;
for(i=1;i<=n;i++) {
d[i] = maps[i][x];
d1[i] = maps[x][i];
}
for(i=1;i<=n;i++)
{
mini=INF;
k=-1;
for(j=1;j<=n;j++)
{
if(!v[j] && d[j]<mini)
{
k = j;
mini = d[k];
}
}
v[k]=1;
for(j=1;j<=n;j++)
{
if(!v[j] && d[k]+maps[j][k]<d[j]) //这里注意相当于从终点向起点找那么 此时便是相反的操作 maps[j][k]+d[k]操作为 反向判断点到集合是否满足条件
{
d[j]=d[k]+maps[j][k];
}
}
}
for(int i = 0; i <= n; i++) v[i] = 0;//反
for(i=1;i<=n;i++)
{
mini=INF;
k=-1;
for(j=1;j<=n;j++)
{
if(!v[j] && d1[j]<mini)
{
k = j;
mini = d1[k];
}
}
v[k]=1;
for(j=1;j<=n;j++)
{
if(!v[j] && d1[k]+maps[k][j]<d1[j])
{
d1[j]=d1[k]+maps[k][j];
}
}
}
int mi=-1;
for(i=1;i<=n;i++){
if(d[i]+d1[i]>mi)
mi=d[i]+d1[i];
}
return mi;
}
void init()
{
memset(v,0,sizeof(v)); //清除标记
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
maps[i][j]=INF;
maps[i][i]=0;//一定记得注意这里同一个点距离为0
}
}
}
int main()
{
//int x;
while(scanf("%d%d%d", &n, &m, &x) != EOF){
init();
int len_max = -INF;
//int len_max1 = -INF, len_max2 = -INF;
int node1, node2, len;
for(int i = 0; i < m; i++){
scanf("%d%d%d", &node1, &node2, &len);
if(maps[node1][node2] > len){
maps[node1][node2] = len;
}
}
cout << Dijkstra() << endl;
}
return 0;
}
poj3268
最新推荐文章于 2023-11-17 18:30:00 发布