社区讨论

迪杰斯特拉最短路模版题求调

题目总版参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lznwmkda
此快照首次捕获于
2024/08/10 16:59
2 年前
此快照最后确认于
2024/08/10 18:19
2 年前
查看原帖
网址: https://deeplearning.org.cn/group/1138/training/1754/problem/P1513/full-screen
CPP
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
int n,m,s,t,idx;
int dis[3000],vis[3000];
int e[15000],w[15000],h[15000],ne[15000];
struct node {
	int x,d;
	bool operator < (node p) const {
		return d > p.d;
	}
	node(int x,int d):x(x),d(d) {}
};
inline int read() {
	int date=0,w=1;
	char c=getchar();
	while(c<'0' || c>'9') {
		if(c=='-') w=-1;
		c=getchar();
	}
	while(c>='0' && c<='9') {
		date=date*10+(c-'0');
		c=getchar();
	}
	return date*w;
}
void add(int a,int b,int c) {
	e[++idx]=b;
	w[idx]=c;
	ne[idx]=h[a];
	h[a]=idx;
}
 
void dijkstra() {
	memset(dis,0x7f,sizeof(dis));
	priority_queue<node> q;
	dis[s]=0;
	node u(s,dis[s]);
	q.push(u);
	while(!q.empty()) {
		node u=q.top();
		q.pop();
		if(vis[u.x]) continue;
		vis[u.x]=1;
		for(int i=h[u.x]; i; i=ne[i]) {
			if(dis[e[i]] > dis[u.x] + w[i]) {
				dis[e[i]] = dis[u.x] + w[i];
				node v(e[i],dis[e[i]]);
				q.push(v);
			}
		}
	}
}
 
int main() {
	n=read(),m=read(),s=read(),t=read();
	for(int i=1; i<=m; i++) {
		int a=read(),b=read(),c=read();
		add(a,b,c);
		add(b,a,c);
	}
	dijkstra();
	cout<<dis[t];
	return 0;
}

回复

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

正在加载回复...