题 意:鬼知道。
思 路:Floyd算法。
学习点:Floyd算法。void procFloyd() { int i, j, k; int tmp; for (k = 0; k != nNum; ++k) { for (i = 0; i != nNum; ++i) { for (j = 0; j != nNum; ++j) { tmp = dis[i][k] + dis[k][j]; if (tmp < dis[i][j]) { dis[i][j] = tmp; } } } } return; }
源代码:
#include <stdio.h> #define INF 32767 #define nSize 101 int nNum, minCost, nIndex; int dis[nSize][nSize]; void funcInput(); void procFloyd(); void funcSolve(); void funcOutput(); int main() { while (1 == scanf("%d", &nNum), nNum) { funcInput(); funcSolve(); funcOutput(); } return 0; } void funcInput() { int i, j; int nPair, nTo, nCost; for (i = 0; i != nNum; ++i) { for (j = 0; j != nNum; ++j) { if (i == j) dis[i][j] = 0; else dis[i][j] = INF; } } for (i = 0; i != nNum; ++i) { scanf("%d", &nPair); for (j = 0; j != nPair; ++j) { scanf("%d %d", &nTo, &nCost); dis[i][nTo-1] = nCost; } } return; } void procFloyd() { int i, j, k; int tmp; for (k = 0; k != nNum; ++k) { for (i = 0; i != nNum; ++i) { for (j = 0; j != nNum; ++j) { tmp = dis[i][k] + dis[k][j]; if (tmp < dis[i][j]) { dis[i][j] = tmp; } } } } return; } void funcOutput() { if (minCost == INF) printf("disjoint/n"); else printf("%d %d/n", nIndex, minCost); return; } void funcSolve() { int i, j; int nMax; procFloyd(); minCost = INF; //这里应该是本题难以理解的地方,读题。 for (i = 0; i != nNum; ++i) { nMax = 0; for (j = 0; j != nNum; ++j) { if (dis[i][j] > nMax) nMax = dis[i][j]; } if (nMax < minCost) { minCost = nMax; nIndex = i; } } nIndex += 1; return; }