POJ 3268 Silver Cow Party 【反向dijkstra】

六月ゝ 毕业季﹏ 提交于 2020-02-07 02:56:32

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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!