POJ3268 Silver Cow Party(最短路径)

题意:

每个农场有一头牛,现在要到农场x开派对,路径是单向的,要求开完派对后还要回到原农场,求所有牛的最短路径的最大值

要点:

就是一个定终点求最短路径的变形,现在已经知道终点,从终点回到原农场的最短路径很好求,直接dijkstra算法即可,想求原农场到终点的最短路径只要将所有的单向路反向即可。利用函数的参量传递可以比较方便的求出。


15382144 Seasonal 3268 Accepted 8056K 47MS C++ 1136B 2016-04-12 14:32:55
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INF 0x3f3f3f3f
int n, m, start;
int map[1005][1005], mapt[1005][1005];
int d1[1005], d2[1005];
bool vis[1005];

void dijkstra(int x,int mapx[][1005],int dis[])//利用参量传递
{
	memset(vis, true, sizeof(vis));
	for (int i = 1; i <= n; i++)
		dis[i] = mapx[x][i];
	vis[x] = false;
	int min, temp;
	for (int i = 1; i <= n; i++)
	{
		min = INF;
		for (int j = 1; j <= n;j++)
			if (vis[j] && min > dis[j])
			{
				temp = j;
				min = dis[j];
			}
		vis[temp] = false;
		for (int j = 1; j <= n; j++)
			if (vis[j] && dis[temp] + mapx[temp][j] < dis[j])
				dis[j] = dis[temp] + mapx[temp][j];
	}
}

int main()
{
	scanf("%d%d%d", &n, &m, &start);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
		{
			if (i == j)
				map[i][j] = mapt[i][j] = 0;
			else
				map[i][j] = mapt[i][j] = INF;//开两个路径记录数组,节省了时间
		}
	while (m--)
	{
		int a, b, t;
		scanf("%d%d%d", &a, &b, &t);
		map[a][b] = t;
		mapt[b][a] = t;
	}
	dijkstra(start, map,d1);
	dijkstra(start, mapt, d2);
	int max = -1;
	for (int i = 1; i <= n; i++)
	{
		if (max < d1[i]+d2[i])
			max = d1[i]+d2[i];
	}
	printf("%d\n", max);
	return 0;
}


posted @ 2016-04-12 14:49  seasonal  阅读(102)  评论(0编辑  收藏  举报