POJ 3268 Silver Cow Party 【反向dijkstra】

POJ 3268 Silver Cow Party

题目大意:
每个农场有一只奶牛,所有奶牛都要去指定的一个农场X中聚会,聚会结束后各自回自己的农场,
求所有的奶牛出门参加聚会再回到家中的最短用时,即求出耗时最长的奶牛的时间

具体思路:
最短路求解,先求x到各个农场的时间,再将各边反向,再求一次x到各个农场的时间。
将两个时间相加,最小的时间即为所求
(求图中所有点到指定点的最短距离可以转化为求指定点到所有点的最短距离,有向图要反向)

具体代码:

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

你可能感兴趣的:(OJ题解,最短路)