B3647 【模板】Floyd · znzryb
## AC代码
中心思想就是
`// 以i点为中间点,对全部路径进行更新`
只是求个最短路径的话连Path数组都不需要
AC记录
[https://www.luogu.com.cn/record/186274091](https://www.luogu.com.cn/record/186274091)
```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
#include <deque>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <bitset>
using namespace std;
typedef long long ll;
const ll N=110;
ll n,m,D[N][N],inf; // P[N][N];
void debug() {
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++)
cout<<D[i][j]<<" ";
cout<<endl;
}
}
inline void Floyd() {
for(int i=1;i<=n;i++) { // 以i点为中间点,对全部路径进行更新
for(int j=1;j<=n;j++) {
if(j==i) // 1->xxx node 无需更新
continue;
for(int k=1;k<=n;k++) {
if(k==i)
continue;
// 以i点为中间点,
D[j][k]=min(D[j][k],D[j][i]+D[i][k]);
}
}
}
debug();
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
memset(D,0x3f,sizeof(D)); // 初始化
inf=D[0][0];
for(int i=1;i<=n;i++)
D[i][i]=0;
for(int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
P[i][j]=-1;
for(int i=1;i<=m;i++) {
ll u,v,w;
cin>>u>>v>>w;
D[u][v]=min(D[u][v],w); // 处理一下重边与自环等特殊情况
D[v][u]=min(D[v][u],w);
// P[u][v]=u; // u->v的最短路径就是u->v,存最后一个点的前驱,即u
}
// debug();
// cout<<endl;
Floyd();
}
// AC https://www.luogu.com.cn/record/186274091
```
## 心路历程(WA,TLE,MLE……)