for(k=1;k<=n;k++)//k代表转折点
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(Map[i][k]<N && Map[k][j]<N && Map[i][j]>Map[i][k]+Map[k][j] )//判断以K为转折点,i到j的距离会不会减少
Map[i][j]=Map[i][k]+Map[k][j];
}
}
}
Input
输入保证至少存在1条商店到赛场的路线。
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
32
#include<iostream> #include<cstdio> using namespace std; #define N 10000010 int Map[105][105]; int main() { int m,n; int i,j,k; while(scanf("%d%d",&n,&m) && m+n) { int a,b,c; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i==j) Map[i][j]=0; else Map[i][j]=N; } } while(m--) { scanf("%d%d%d",&a,&b,&c); Map[a][b]=c; Map[b][a]=c; } for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(Map[i][k]<N && Map[k][j]<N && Map[i][j]>Map[i][k]+Map[k][j] ) Map[i][j]=Map[i][k]+Map[k][j]; } } } printf("%d\n",Map[1][n]); } }