2024-11-03 21:22阅读: 14评论: 0推荐: 0

最短路默写

dijkstra

注意:vector空间问题,以及正负权。

#include <bits/stdc++.h>
using namespace std;
const long long INF=999999999999999999;
int n,m,x,y,t=1;
long long dis[400001];
bool b[400001];
int head[400001];
struct st {
	int v;
	long long w;
	friend bool operator < (st a,st b)
	{
		return a.w>b.w;
	}
};
struct node{
	int x,y,z,next;
}a[2000001];
void add(int x,int y,int z)
{
	a[t].x=x;
	a[t].y=y;
	a[t].z=z;
	a[t].next=head[x];
	head[x]=t++;
}
priority_queue<st> q;
void di(int s) {
	q.push({s,0});
	while(!q.empty()) {
		int xx=q.top().v;
		q.pop();
		if(b[xx]) continue;
		if(xx==y) break;
		b[xx]=1;
		for(int it=head[xx];it;it=a[it].next) {
			int u=a[it].y,w=a[it].z;
			if(dis[u]>dis[xx]+w) {
				dis[u]=dis[xx]+w;
				q.push({u,dis[u]});
			}
		}
	}
}
signed main() {
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	scanf("%lld %lld",&n,&m);
	for(int i=1; i<=m; i++) {
		int a,b,c;
		scanf("%d %d %d",&a,&b,&c);
		add(a,b,c);
	}
	scanf("%lld %lld",&x,&y);
	for(int i=1; i<=n; i++) 
	{
		dis[i]=INF;
		b[i]=false;
	}
	dis[x]=0;
	di(x);
	for(int i=1;i<=n;i++) printf("%lld ",dis[i]);
	return 0;
}

spfa

容易被卡,但是部分有负权或者需要判负权回路的时候挺好用的。

#include <bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
int n,m,s;
int dis[100001],b[100001];
struct st {
	int v,w;
};
vector<st> v[100001];
queue<int> q;
void spfa(int s) {
	q.push(s);
	b[s]=1;
	while(!q.empty()) {
		int x=q.front();
		q.pop();
		b[x]=0;
		for(auto it:v[x]) {
			int u=it.v,w=it.w;
			if(dis[u]>dis[x]+w) {
				dis[u]=dis[x]+w;
				if(!b[u]) {
					q.push(u);
					b[u]=1;
				}
			}
		}
	}
}
signed main() {
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>s;
	for(int i=1; i<=m; i++) {
		int a,b,c;
		cin>>a>>b>>c;
		v[a].push_back({b,c});
	}
	for(int i=1; i<=n; i++) dis[i]=2147483647;
	dis[s]=0;
	spfa(s);
	for(int i=1; i<=n; i++) cout<<dis[i]<<" ";
	return 0;
}

本文作者:yaaaaaan

本文链接:https://www.cnblogs.com/yaaaaaan/p/18524001

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   yaaaaaan  阅读(14)  评论(0编辑  收藏  举报
(评论功能已被禁用)
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑
点击右上角即可分享
微信分享提示