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;
}