#522. 【模板】单源最短路径(N^2级别)

#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_52536621/article/details/113832674