POJ 3268 Silver Cow Party
题目大意:
每个农场有一只奶牛,所有奶牛都要去指定的一个农场X中聚会,聚会结束后各自回自己的农场,
求所有的奶牛出门参加聚会再回到家中的最短用时,即求出耗时最长的奶牛的时间
具体思路:
最短路求解,先求x到各个农场的时间,再将各边反向,再求一次x到各个农场的时间。
将两个时间相加,最小的时间即为所求
(求图中所有点到指定点的最短距离可以转化为求指定点到所有点的最短距离,有向图要反向)
具体代码:
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int N = 1005;
const int INF = 1e5;
int maps[N][N];
int rmaps[N][N]; //反向图
int visit[N];
int dis[N];
int rdis[N];
int n, m, x;
void init()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
rmaps[i][j] = maps[i][j] = INF;
}
void dijkstra(int d[], int maps[][N])
{
for (int i = 1; i <= n; i++)
visit[i] = 0;
for (int i = 1; i <= n; i++)
{
d[i] = maps[x][i];
}
d[x] = 0;
visit[x] = 1;
for (int i = 1; i <= n; i++)
{
int t = -1;
for (int j = 1; j <= n; j++)
{
if (!visit[j] && (t == -1 || d[t] > d[j]))
t = j;
}
if (t == -1)return;
visit[t] = 1;
for (int j = 1; j <= n; j++)
{
if (!visit[j] && d[j] > d[t] + maps[t][j])
d[j] = d[t] + maps[t][j];
}
}
}
int getAns()
{
int ans = -1;
for (int i = 1; i <= n; i++)
if (i != x && dis[i] + rdis[i] > ans)ans = dis[i] + rdis[i];
return ans;
}
int main()
{
cin >> n >> m >> x;
init();
for (int i = 1; i <= m; i++)
{
int a, b, w;
cin >> a >> b >> w;
if (w < maps[a][a]) //考虑重边
maps[a][b] = w;
rmaps[b][a] = w;
}
dijkstra(dis, maps);
dijkstra(rdis, rmaps);
printf("%d\n", getAns());
return 0;
}
来源:CSDN
作者:三寸雪
链接:https://blog.csdn.net/weixin_44339734/article/details/104201021