<span style="font-size:24px;">弗洛伊德一般只适合100个点以内的题,因为弗洛伊德的时间复杂度为n的三次方,如果点太多容易超时,而且,它也不能求有负环的题,如果遇到有负环的题最好用贝尔曼-福特算法</span>
#include <stdio.h>
#include <string.h>
#define maxnum 1000
#define maxint 0x3f3f3f3f
int map[maxnum][maxnum];
int n,m;
void Floyd() //弗洛伊德算法
{
int k,i,j;
for(k=1; k<=n; k++) //中转点控制最外边的循环
for(i=1; i<=n; i++) //其次是起点控制循环
for(j=1; j<=n; j++) //最内层的循环是终点控制的
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
int main()
{
int i,x,y,z,j;
while(~scanf("%d %d",&n,&m))
{
memset(map,maxint,sizeof(map)); //先都设成最大值
for(i=1; i<=m; i++) //开始建无向图
{
scanf("%d %d %d",&x,&y,&z);
if(z<map[x][y])
{
map[x][y]=z;
map[y][x]=z;
}
}
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(i==j)
map[i][j]=0; //记得到本身的距离为零
Floyd();
printf("%d\n",map[1][n]);
}
}