社区讨论

想要输出此题最短路径上的节点,输出算法出了问题,求佬帮我看看

P1339[USACO09OCT] Heat Wave G参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo315uf2
此快照首次捕获于
2023/10/23 23:06
2 年前
此快照最后确认于
2023/10/23 23:06
2 年前
查看原帖
C
没添加这个输出路径函数dfs前可以正常运行,但添加了之后反而输出被阻塞了,不明白问题出在哪里,这个dfs是我抄来的,不是很理解,可以的话,希望大佬帮我解释一下
#include<bits/stdc++.h>
using namespace std;
int pre[2500];//记录最短路径上节点的前驱 
int dis[2500];//dis[i]表示起点至其他顶点最短距离 
int v[2500][2500];//v[j][k]表示顶点j至顶点k的距离 
int book[2500]={0};//顶点访问标记数组,初始化皆为0表示未访问 
int n,m,s,t;//总共n个顶点,输入m行,每行三个数ugw代表连接u点与g点的一条边距离为w,初始顶点为s,目标顶点为g,问从顶点s至t的最短距离 
int u,g,w;//连接u点和g点的一条边长度为w 
void dijstra(){
	int min,z;//设置min用来更新dis,z用来记录更新dis后的对应顶点 
	for(int k=1;k<=n;k++){//大循环,每一次大循环更新一次dis数组 
		min=INT_MAX;
		for(int i=1;i<=n;i++){//小循环,找s周边最短边的接入点 
			if(book[i]==0&&min>dis[i]){//若该s周边点未访问过,且边长小于上一个s周边点 
				min=dis[i];//更新min,以便下一层小循环比对 
				z=i;//记录更新后的点 
			}
		}
		book[z]=1;//设置z点访问位为1 
		for(int i=1;i<=n;i++){//搜寻新接入点z的周边连接边,并更新dis表,使之长度最短 
			if(book[i]==0&&dis[i]>dis[z]+v[z][i]){//如果旧边顶点到i点的距离大于新边顶点到z点加上z点到i点的距离 
				dis[i]=dis[z]+v[z][i];
				pre[i]=z;//更新dis表,以及前驱 
			}
			else if(book[i]==0&&dis[i]==dis[z]+v[z][i])
			pre[i]=z; 
		}
	}
}
void dfs(int start,int end){//输出最短路径经过的节点 
	if(start==end){
		cout<<start;
		return;
	}
	dfs(start,pre[end]);
	cout<<end;
	return;
}
int main(){
	cin>>n>>m>>s>>t;
	memset(v,0x3f,sizeof(v));//给邻接矩阵群体赋初始值为无穷大 
	for(int i=1;i<=m;i++){ // 输入m条边,每条边连接u点g点,长度为w 
		cin>>u>>g>>w;
		v[u][g]=v[g][u]=min(v[u][g],w);//十一条边塞入邻接表更新 
	}
	for(int i=1;i<=n;i++){
		dis[i]=v[s][i];//用邻接表已有信息给dis数组赋初始值,代表顶点s至i点的最短距离 
	}
	book[s]=1;//顶点访问位置1 
	dijstra();//调用迪杰斯特拉算法 
	dfs(s,t);//输出最短路径经过的节点 
	cout<<dis[t];//输出顶点s至t的最短距离 
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...