题目大意:给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最短时间,从这些最短时间里找出一个最大值输出
到牛x的距离是最短路程 回来的时候再算一遍 只需要把地图横纵轴交换一下位置就行了 最后再加上2段路程选出最大值就好了
#include<stdio.h>
#include<iostream>
using namespace std;
#define maxv 1010
#define inf 1<<29
int map[maxv][maxv],d[maxv],dback[maxv];
bool vis[maxv];
int n,m,x;
int dijkstra()
{
int i,j,v,min;
for(i=1; i<=n; i++)
{
vis[i]=0;
d[i]=map[x][i];
dback[i]=map[i][x];
}
for(i=1; i<=n; i++)
{
min=inf;
for(j=1; j<=n; j++)
{
if(!vis[j]&&d[j]<min)
{
min=d[j];
v=j;
}
}
vis[v]=1;
for(j=1; j<=n; j++)
{
if(!vis[j]&&map[v][j]+d[v]<d[j])
{
d[j]=map[v][j]+d[v];
}
}
}
for(i=1; i<=n; i++)
{
vis[i]=0;
}
for(i=1; i<=n; i++)
{
min=inf;
for(j=1; j<=n; j++)
{
if(!vis[j]&&dback[j]<min)
{
min=dback[j];
v=j;
}
}
vis[v]=1;
for(j=1; j<=n; j++)
{
if(!vis[j]&&map[j][v]+dback[v]<dback[j])
dback[j]=map[j][v]+dback[v];
}
}
min=-1;
for(i=1; i<=n; i++)
{
if(d[i]+dback[i]>min)
min=d[i]+dback[i];
}
return min;
}
int main()
{
int i,j,t1,t2,t3;
while(~scanf("%d%d%d",&n,&m,&x))
{
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(i==j) map[i][j]=0;
else map[i][j]=inf;
}
}
for(i=1; i<=m; i++)
{
scanf("%d %d %d",&t1,&t2,&t3);
map[t1][t2]=t3;
}
printf("%d\n",dijkstra());
}
return 0;
}

本文介绍了一个基于迪杰斯特拉算法的实现,用于寻找一群牛到指定聚会地点并返回的最短路径,最终输出除聚会地点外其他各点的最大往返时间。
807

被折叠的 条评论
为什么被折叠?



