经典的最短路 只不过暴力求解肯定不行 所以呢 想一下简化的办法;
(刚开始也是写了循环dijkstra 果断tle 所以后来想了一下)
我们要计算去的路和回来的路 ,回来的路好半 ,以party为起点的单源最短路 /
接下来我们想办法 怎么弄出来去的路 :其实去的路就是把map翻转以后 从party的单源最短路径;
告诉我们动脑子才是王道!
下面附ac代码
#include "stdio.h"
#include "cmath"
#include "string.h"
#include "stdlib.h"
#define maxn 1003
#define inf 1000000
int map[maxn][maxn];
int save[maxn];
int d[maxn];
int vis[maxn];
int vis2[maxn][maxn];
void dijkstra(int n,int start)
{
for(int i=1;i<=n;i++) d[i]=inf;
d[start]=0;
for(int i=1;i<=n;i++)
{
int x=inf;int m = 0;
for(int j=1;j<=n;j++)
if(!vis[j]&&d[j]<x) x=d[m=j];
vis[m]=1;
for(int j=1;j<=n;j++)
if(d[j]>d[m]+map[m][j]) d[j]=d[m]+map[m][j];
}
return;
}
int main()
{
int n,m,t;
int max=0;
while(scanf("%d %d %d",&n,&m,&t)!=EOF)
{
memset(vis2,0,sizeof(vis2));
memset(save,0,sizeof(save));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=inf;
for(int i=1;i<=m;i++)
{
int x,y,dist;
scanf("%d %d %d",&x,&y,&dist);
if(map[x][y]&&dist<map[x][y]) map[x][y]=dist;
else map[x][y]=dist;
}// input;
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=n;j++)
// printf("%d ",map[i][j]);
// printf("\n");
//}//test output;
memset(vis,0,sizeof(vis));
dijkstra(n,t);
for(int i=1;i<=n;i++) save[i]+=d[i];
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(vis2[i][j]) continue;
int c=map[i][j];
map[i][j]=map[j][i];
map[j][i]=c;
vis2[i][j]=vis2[j][i]=1;
}
dijkstra(n,t);
for(int i=1;i<=n;i++) save[i]+=d[i];
for(int i=1;i<=n;i++)
{
if(i==t) continue;
else if(max<save[i]) max=save[i];
}
printf("%d\n",max);
}
return 0;
}