90分,第3个点WA,大佬可以帮忙看一下为什么吗
查看原帖
90分,第3个点WA,大佬可以帮忙看一下为什么吗
678783
good_pig楼主2022/3/10 08:56
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
const int maxv=100010;
const int INF=1000000000;
struct Node{	//边节点 
	int v;		//边指向的节点编号 
	int w;		//边的权值 
	Node(int _v,int _w){
		v=_v;
		w=_w;
	}
};
vector<Node> Adj[maxv];		//图的邻接表表示
bool vis[maxv]={false} ;		//已找到最短路的节点集合
int d[maxv];	//从起点到终点的最短路径长度 
int n,m,s;		//共n个节点,m条边,s为源点 
void Dijkstra(int s){	 
	fill(d,d+maxv,INF);		//初始化源点到各个节点的最短路径为无穷大
	d[s]=0;		//源点到自身最短路径为0 
	for(int i=1;i<=n;i++){		//循环n次,每次都能找到一个节点加入已找到的最短路径节点集合 
		int min=INF,u=-1;
		for(int j=1;j<=n;j++){
			if(d[j]<min && !vis[j]){
				u=j;					//找到最短的d[u]并且节点u不在集合中 
				min=d[j];
			}
		}
		vis[u]=true;		//已找到源点到u号节点的最短路径 ,u节点加入集合 
		for(int j=0;j<Adj[u].size();j++){		//遍历与节点u相连的所有边 
			int v=Adj[u][j].v;			//取出该边指向的节点编号 
			//如果该节点未加入集合,并且以u为中介能使源点到该节点的最短路径变短
			if(!vis[v] && d[u]+Adj[u][j].w<d[v]){		 
				d[v]=d[u]+Adj[u][j].w;		//更新源点到j的最短路径 (优化d[v]) 
			}	
		} 
	} 
}
int main(){
	cin>>n>>m>>s;
	for(int i=0;i<m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		Node node=Node(v,w);
		Adj[u].push_back(node);
	}
	Dijkstra(s);
	for(int i=1;i<=n;i++){
		printf("%d ",d[i]);
	}
	return 0;
} 
2022/3/10 08:56
加载中...