当前位置: 代码迷 >> 综合 >> POJ3268 Silver Cow Party(最短路径)
  详细解决方案

POJ3268 Silver Cow Party(最短路径)

热度:44   发布时间:2024-01-16 13:45:34.0

题意:

每个农场有一头牛,现在要到农场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;elsemap[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;
}