0%

B3647 【模板】Floyd

AC代码

中心思想就是
// 以i点为中间点,对全部路径进行更新

只是求个最短路径的话连Path数组都不需要

AC记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#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……)