这次是用Folye算法实现的。 发现由于使用Folye求多点最短路只要调用一次函数。 如果用Dijkstra求则要多次调用函数,初始化数组,会使程序运行时间变长。 所以说,求多点最短路,最好还是使用Folye算法。 #include <iostream> using namespace std; #define NUMOFPOINT 301 #define INFINITE 99999999 void Folye(int Way[][NUMOFPOINT], int n) { int i,j,k; for (i=1;i<=n;i++) for (j=1;j<=n;j++) for (k=1;k<=n;k++) if (Way[j][k]>Way[j][i]+Way[i][k]) Way[j][k] = Way[j][i]+Way[i][k]; } int main() { int m,n,t,x,y,w,a,b; int i,j; int Way[NUMOFPOINT][NUMOFPOINT]; while (scanf("%d%d%d", &n,&m,&t)!=EOF) { memset(Way, 0, sizeof(Way)); for (i=1;i<=n;i++) for (j=1;j<=n;j++) if (i == j) Way[i][j] = 0; else Way[i][j] = INFINITE; for (i=1;i<=m;i++) { scanf("%d%d%d", &x,&y,&w); if (w<Way[x][y]) Way[x][y] = w; } Folye(Way, n); for (i=1;i<=t;i++) { scanf("%d%d", &a, &b); if (Way[a][b]!=INFINITE) printf("%d/n", Way[a][b]); else printf("-1/n"); } } return 0; }