ZOJ-1857

来源:互联网 发布:linux 安装jdk1.7 编辑:程序博客网 时间:2024/06/18 09:50

题目又看错了。。。!!!!晕死啊,又调了半天,我以为是让所有距离相加最小,而题意是让最短路的最大值最小。。坑啊,下次一定要吸取血的教训啊。。好晚了睡觉去了,明天上班又要起不来了。。

#include<stdio.h>#include<string.h>#include<limits.h>static int map[501][501], fire[100];static int f, n;static int dijkstra_each(int start, int *d){int i, known[501], dd[501];memset(known, 0, sizeof(known));memcpy(dd, d, sizeof(dd));dd[start] = 0;int now = start, next = now;while (1){known[now] = 1;int mind = INT_MAX, allknow = 1;for (i = 1; i <= n; i++){if (!known[i])allknow = 0;if (!known[i] && map[now][i] && map[now][i] + dd[now] < dd[i])dd[i] = map[now][i] + dd[now];if (!known[i] && dd[i] < mind){next = i;mind = dd[i];}}if (allknow)break;now = next;}int max = -1;for (i = 1; i <= n; i++)if (dd[i] > max)max = dd[i];return max;}int main(){while (scanf("%d %d", &f, &n) != EOF){memset(map, 0, sizeof(map));int i, a, b, c;for (i = 0; i < f; i++)scanf("%d", &fire[i]);getchar();char s[50];while (1){if (gets(s) == NULL || strlen(s) == 0)break;sscanf(s, "%d %d %d", &a, &b, &c);map[a][b] = map[b][a] = c;}int d[501];for (i = 0; i < 501; i++)d[i] = INT_MAX;for (i = 0; i < f; i++)d[fire[i]] = 0;int res = fire[0], temp, md = INT_MAX;for (i = 1; i <= n; i++)if (d[i]){temp = dijkstra_each(i, d);if (temp < md){md = temp;res = i;}}printf("%d\n", res);}return 0;}


0 0