求助
查看原帖
求助
1278346
wanmingxing楼主2025/7/23 09:41
//朴素版的dijkstra
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+3;
const int INF=0x3f3f3f3f;
vector<pair<int,int>> g[N];//图
int dist[N];//从起点到i这个节点的最短路径
bool vis[N];//某个节点是否被访问过 
int n,m,s;//顶点、边、起始点 
int getMin(){//在dist集合找一个最小的权值的点,同时未被访问过 
	int minn=-1;
	for(int i=1;i<=n;i++){
		if(!vis[i]&&(minn==-1||dist[i]<dist[minn])){
			minn=i;
		}
	}
	return minn;
}
int main()
{
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		g[u].emplace_back(v,w);
	}
	//初始化起始点到所有节点距离dist
	memset(dist,0x3f,sizeof(dist));
	dist[s]=0;
	for(int i=0;i<n;i++){//遍历所有的点 
		int u=getMin();
		if(u==-1) break;
		vis[u]=true;
		//松弛操作
		for(auto& e:g[u]){
			int v=e.first;
			int w=e.second;
			if(dist[v]>dist[u]+w)
            {
				dist[v]=dist[u]+w;
			}
		} 
	}
	for(int i=1;i<=n;i++)
    {z
		if(dist[i]==INF)
            cout<<pow(2,31)-1;
		else 
            cout<<dist[i]<<" ";
	}
	 
	
	return 0;
} 

不是为什么是90分啊

2025/7/23 09:41
加载中...