Floyd
性质
- 算任意两点的最短距离
- 可含负权边
板子
无向图
初始化:
CLR(mp,INF);
FOR(i,1,e){
int a,b,l;
scanf("%d%d%d",&a,&b,&l);
mp[a][b]=l,mp[b][a]=l;
}
FOR(i,1,m) FOR(j,1,m) path[i][j]=j; //记录路径
算法主干:
FOR(k,1,m) FOR(i,1,m) FOR(j,1,m) //枚举中转点k
if(ans[i][k]+ans[k][j]<ans[i][j])
ans[i][j]=ans[i][k]+ans[k][j],path[i][j]=path[i][k];
输出路径:
//initial and final
while(path[i][f]!=f) printf("%d ",path[i][f]),i=path[i][f];
printf("%d\n",m);