Dijsktra算法求问
  • 板块灌水区
  • 楼主miaojintao
  • 当前回复18
  • 已保存回复18
  • 发布时间2022/2/3 21:50
  • 上次更新2023/10/28 09:45:02
查看原帖
Dijsktra算法求问
408859
miaojintao楼主2022/2/3 21:50

我没用堆优化,自己写的是什么都不太清楚,竟然过了弱化版……

各位都是怎么写的Dij啊,求教

下面是我的代码:

#include<iostream>
#include<climits>
#include<cstring> 
#include<queue>
using namespace std;
const int MAXN=10002;
const int MAXM=500002;
const int INF=INT_MAX;

int n,m,s;
int first[MAXN],d[MAXN],p[MAXN];
bool vis[MAXN];
int u[MAXM],v[MAXM],w[MAXM],nex[MAXM];

void read_graph(){
	memset(w,-1,sizeof(w));
	memset(nex,-1,sizeof(nex));
	memset(first,-1,sizeof(first));
	cin>>n>>m>>s;
	for(int i=1;i<=n;i++) first[i]=-1;
	for(int e=1;e<=m;e++){
		int z;
		cin>>u[e]>>v[e]>>z;
		if(w[e]==-1 || z<w[e]) w[e]=z;
		nex[e]=first[u[e]];
		first[u[e]]=e;
	}
}

void Dijkstra(){
	memset(vis,false,sizeof(vis));
	for(int i=1;i<=n;i++){
		if(i==s) d[i]=0;
		else d[i]=INF;
	}
	for(int i=1;i<=n;i++){
		int x,a=INF;
		for(int y=1;y<=n;y++){
			if(!vis[y] && d[y]<=a){
				a=d[y],x=y;
			}
		}
		vis[x]=true;
		int e=first[x];//
		while(e!=-1){
			int l=u[e],r=v[e];
			if(w[e]!=-1 && d[l]+w[e]>=0 && d[r]>d[l]+w[e]){
				d[r]=d[l]+w[e];
				p[r]=l;
			}
			e=nex[e];
		}//
	}
}

int main()
{
	read_graph();
	Dijkstra();
	for(int i=1;i<=n;i++){
		cout<<d[i]<<' ';
	}
	return 0;
}

read_graph()是按照书上写的,但代码中加斜杠的一大段都是根据自己想法写的(书上没有),请问这样真的是对的吗

还有我这个是属于邻接表还是链式前向星啊,非常感谢!

2022/2/3 21:50
加载中...