基于Dijsktra算法的最短路径求解

数据结构习题解析与实验指导     实验7

#include <iostream>
#include <cstring>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int MAX = 1e6+100;
char x,y;
map<char,int> mp;
map<int,char> mpp;
struct hh{
	int u,v,w,nt;
	hh(){}
	hh(int ww,int vv){
		w=ww;
		v=vv;
	}
	bool operator<(const hh &q) const{
		return w>q.w;
	}
}a[MAX];
int tot,head[MAX],dis[MAX],bian[MAX];
void add(int u,int v,int w){
	a[tot].u=u;
	a[tot].v=v;
	a[tot].w=w;
	a[tot].nt=head[u];
	head[u]=tot++;
}
void init(){
	memset(head,-1,sizeof(head));
	memset(dis,inf,sizeof(dis));
	memset(bian,0,sizeof(bian));
}
void print(int v){
	if(bian[v]==0){
		cout << mpp[v] << " ";
		return;
	}
	print(bian[v]);
	cout << mpp[v] << " ";
	return;
}
void dij(int s){
	priority_queue<hh> q;
	dis[s]=0;
	q.push(hh(dis[s],s));
	while(!q.empty()){
		hh tmp;
		tmp=q.top();
		q.pop();
		int u=tmp.v;
		if(u==mp[y]) break;
		for (int i = head[u]; ~i;i=a[i].nt){
			int v=a[i].v;
			if(dis[v]>dis[u]+a[i].w){
				dis[v]=dis[u]+a[i].w;
				bian[v]=u;
				q.push(hh(dis[v],v));
			}
		}
	}
}
int main(){
	int n,m;
	while(cin >> n >> m){
		if(n==0&&m==0) break;
		init();
		mp.clear();
		mpp.clear();
		int cnt=1;
		for (int i = 0; i < n;i++){
			char ch;
			cin >> ch;
			mp[ch]=cnt;
			mpp[cnt++]=ch;
		}
		for (int i = 0; i < m;i++){
			char u,v;
			int w;
			cin >> u >> v >> w;
			add(mp[u],mp[v],w);
			add(mp[v],mp[u],w);
		}
		cin >> x >> y;
		dij(mp[x]);
		cout << dis[mp[y]] << endl;
		print(mp[y]);
		cout << endl;
	}
	return 0;
}
/*
3 3
A B C
A B 1
B C 1
C A 3
A C
6 8
A B C D E F
A F 100
A E 30
A C 10
B C 5
C D 50
D E 20
E F 60
D F 10
A F
0 0
*/

 

全部评论

相关推荐

03-03 19:02
已编辑
东华理工大学 Node.js
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
7319次浏览 66人参与
# 你的实习产出是真实的还是包装的? #
1411次浏览 35人参与
# 米连集团26产品管培生项目 #
5100次浏览 207人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7192次浏览 38人参与
# 简历第一个项目做什么 #
31397次浏览 317人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186626次浏览 1116人参与
# MiniMax求职进展汇总 #
23353次浏览 304人参与
# 研究所笔面经互助 #
118808次浏览 577人参与
# 面试紧张时你会有什么表现? #
30431次浏览 188人参与
# 简历中的项目经历要怎么写? #
309720次浏览 4171人参与
# AI时代,哪些岗位最容易被淘汰 #
62951次浏览 760人参与
# 职能管理面试记录 #
10753次浏览 59人参与
# 网易游戏笔试 #
6397次浏览 83人参与
# 腾讯音乐求职进展汇总 #
160480次浏览 1107人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
7059次浏览 155人参与
# 正在春招的你,也参与了去年秋招吗? #
362921次浏览 2635人参与
# 你怎么看待AI面试 #
179558次浏览 1193人参与
# 小红书求职进展汇总 #
226969次浏览 1357人参与
# 你觉得通信/硬件有必要实习吗? #
155407次浏览 1065人参与
# 从哪些方向判断这个offer值不值得去? #
56717次浏览 357人参与
# 校招笔试 #
468444次浏览 2959人参与
# 你的房租占工资的比例是多少? #
92166次浏览 896人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务