啊,矩阵转置好强大
#include<iostream>
#include<cstring>
using namespace std;
int n,m,h;
const int inf = 0x3f3f3f3f;
int a[1003][1003];
int vis[1003];
int cost[1003];
int sum[1003];
void dijkstra()
{
int i,j;
for(i=0;i<n;i++)
cost[i]=a[h][i];
vis[h]=1;
for(int k=1;k<n;k++)
{
int u=0;
int minn = inf;
for(i=0;i<n;i++)
{
if(!vis[i]&&cost[i]<minn)
{
minn=cost[i];
u=i;
}
}
vis[u]=1;
for(j=0;j<n;j++)
{
if(!vis[j]&&cost[u]+a[u][j]<cost[j])
cost[j]=cost[u]+a[u][j];
}
}
}
int main()
{
cin>>n>>m>>h;
h--;
int i,j;
int x,y,z;
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
memset(sum,0,sizeof(sum));
for(i=0;i<m;i++)
{
cin>>x>>y>>z;
x--;
y--;
if(!a[x][y]||a[x][y]>z)
a[x][y]=z;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(a[i][j]==0)
a[i][j]=inf;
dijkstra();//计算从x点回到其他个点的最短距离
for(i=0;i<n;i++)
{
sum[i]+=cost[i];
}
for(i=0;i<n;i++) //进行矩阵的转置
{
for(j=i+1;j<n;j++)
{
swap(a[i][j],a[j][i]);
}
}
memset(vis,0,sizeof(vis));
dijkstra();//此时计算的是个点到x点的最点距离,很强大
for(i=0;i<n;i++)
sum[i]+=cost[i];
int ans=0;
for(i=0;i<n;i++)
{
if(sum[i]!=2*inf)
ans=max(sum[i],ans);
}
cout<<ans<<endl;
}