#522. 【模板】单源最短路径(N^2级别)
思路:首先把所有点的最小距离设为无穷大,然后把s点的最小距离赋值为0,接着进行循环,每次枚举出没有被标记且到达距离最小的点v,再把v点标记一下,最后把与v点有关的所有点的最小距离计算出来,反复如上操作,求出所有点。
注意点
一个点到另一个点可能有多条路径,所以我们要保留最小值。
代码
#include<bits/stdc++.h>
using namespace std;
vector<int>a[1001];
int n,m,x[1001],f,g,w[1001][1001],i;
bool b[1001];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>f;
for(i=1;i<=n;i++)
for(g=1;g<=n;g++)
w[i][g]=INT_MAX;
for(i=1;i<=n;i++)
x[i]=INT_MAX;
x[f]=0;
while(m--){
cin>>f>>g>>i;
w[f][g]=min(i,w[f][g]);
a[f].push_back(g);
}
f=0;
for(f;f<n;f++){
m=INT_MAX;
for(i=1;i<=n;i++)
if(!b[i]&&x[i]<m){
m=min(x[i],m);
g=i;
}
b[g]=true;
m=a[g].size();
for(i=0;i<m;i++)
x[a[g][i]]=min(x[a[g][i]],x[g]+w[g][a[g][i]]);
}
for(i=1;i<=n;i++)
cout<<x[i]<<' ';
return 0;
}