蒟蒻求教一个最短路记录路径的问题
查看原帖
蒟蒻求教一个最短路记录路径的问题
87583
云锣楼主2021/4/30 23:50

AC了堆优化的Djikstra,现在想用pre[ ]来记录路径。写了一下发现不对,请教dalao指点一下要怎么改呢

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 100010, M = 1000010;
int head[N], ver[M], edge[M], Next[M], d[N];
bool v[N];
bool v2[N];
int pre[N];
int pre_len=0;
int n, m, tot, s;


priority_queue< pair<int, int> > q;  //1距离的相反数  2节点编号  默认大顶堆 

void add(int x, int y, int z) {  //邻接表 
	
	if(x!=y)
	{
		ver[++tot] = y, edge[tot] = z, Next[tot] = head[x], head[x] = tot;
	}
	
}

void dijkstra() {
	//memset(d, 99999, sizeof(d)); 
	for(int i=0;i<N;i++)
	{
		d[i]=2147483647;
	}
	memset(v, 0, sizeof(v)); 
	memset(v2, 0, sizeof(v2)); 
	d[s] = 0;
	q.push(make_pair(0, s));
	while (q.size()) {
		
		int x = q.top().second; q.pop();  //得到堆顶最小距离的点x
		//pre[pre_len]=x;
		//pre_len++;
		if (v[x]) continue;
		v[x] = 1;
		
		for (int i = head[x]; i; i = Next[i]) {
			int y = ver[i], z = edge[i];
			//v2[i]=1;
			if (d[y] > d[x] + z) {  //松弛操作更新距离 
			
				d[y] = d[x] + z;
				q.push(make_pair(-d[y], y));
				//pre[y]=x;
				if(v[y]==0) 
				{
					//q.push(make_pair(-d[y], y));
					pre[y]=x;
					
					//pre_len++;
				}
			}
		}
		
		//memset(v2, 0, sizeof(v2));
		
		
	}
}

int main() {
	
	int o;
	for(o=0;o<N;o++)
	{
		head[o]=0;
		v[o]=0;
	}
	for(o=0;o<M;o++)
	{
		ver[o]=0;
		edge[o]=0;
		Next[o]=0;
	}  //初始化 
	
	for(o=0;o<N;o++)
	{
		pre[o]=-1;
	}
	
	
	cin >> n >> m >> s;  //n: 顶点数  m:连边数  s:起始点 
	
	for (int i = 1; i <= m; i++) {
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z);
		add(x, y, z);
	}
	
	dijkstra();
	for (int i = 1; i <= n; i++)
		cout<<d[i]<<" ";
		
	cout<<endl;
	for(int i=1;i<10;i++)
	{
		cout<<pre[i]<<" ";
	}
	return 0;
}


2021/4/30 23:50
加载中...