求调 Dijkstra,悬赏关注!
  • 板块学术版
  • 楼主2022LiJinLin
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/18 21:12
  • 上次更新2023/11/2 12:58:29
查看原帖
求调 Dijkstra,悬赏关注!
926958
2022LiJinLin楼主2023/10/18 21:12

rt

#include<bits/stdc++.h>
using namespace std;
const long long inf=0x3f3f3f3f3f3f3f3fLL;
const int N=3e5+5;
struct edge{
	int from,to;
	long long w;
	edge(int a,int b,long long c){from=a;to=b;w=c;}
};
vector<edge> e[N];
struct node{
	int id;
	long long n_dis;
	node(int b,long long c){id=b;n_dis=c;}
	inline bool operator<(const node &a) const{
		return n_dis>a.n_dis;
	}
};
int n,m;
int pre[N];
void print_path(int s,int t){
	if(s==t){
		printf("%d",s);
		return;
	}
	print_path(s,pre[t]);
	printf(" %d",t);
}
long long dis[N],ans;
bool done[N];
void dijkstra(){
	int s=1;
	for(int i=1;i<=n;i++){
		dis[i]=inf;
		done[i]=false;
	}
	dis[s]=0;
	done[s]=true;
	priority_queue<node> q;
	q.push(node(s,dis[s]));
	while(!q.empty()){
		node u=q.top();
		q.pop();
		if(done[u.id]) continue;
		done[u.id]=true;
		for(int i=0;i<e[u.id].size();i++){
			edge y=e[u.id][i];
			if(done[y.to]) continue;
			if(dis[y.to]>u.n_dis+y.w){
				dis[y.to]=u.n_dis+y.w;
				q.push(node(y.to,dis[y.to]));
				pre[y.to]=u.id;
			}
		}
	}
//	print_path(s,n);
}
int main(){
	scanf("%d%d",&n,&m);
	while(m--){
		int u,v;
		long long w;
		scanf("%d%d%lld",&u,&v,&w);
		e[u].push_back(edge(u,v,w));
	}
	dijkstra();
	for(int i=1;i<=n;i++){
		if(dis[i]>=inf) printf("-1 ");
		else printf("%lld ",dis[i]);
	}
	return 0;
}

这份代码的子函数 dijkstra() 计算从 11 到各个节点的最短路径,问题大概率也出在这里。给出有效建议的给一个关注!

2023/10/18 21:12
加载中...