首页 > 其他分享 >dijkstra and spfa

dijkstra and spfa

时间:2024-09-11 18:24:20浏览次数:1  
标签:cnt edg int spfa vis dijkstra maxn dis

spfa

struct Node{
	int w,to,nxt;
}edg[maxn];
int head[maxn],tot;
void add_edge(int u,int w,int v){
	edg[++tot].nxt=head[u];edg[tot].to=v;
	edg[tot].w=w;head[u]=tot;
}
bool vis[maxn];
int cnt[maxn],dis[maxn];
bool spfa(int n,int s){
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	memset(cnt,0,sizeof(cnt));
	queue<int>q;
	dis[s]=0,vis[s]=1;
	q.push(s);
	while(!q.empty()){
		int u=q.front();
		q.pop();vis[u]=0; 
		for(int i=head[u];i;i=edg[i].nxt){
			int v=edg[i].to,w=edg[i].w;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				cnt[v]=cnt[u]+1;
				if(cnt[v]>=n)return false;
				if(!vis[v])q.push(v),vis[v]=1;
			}
		}
	}
	return true;
}

dijkstra

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
#define mkp make_pair
#define int long long
const int maxn=3e5+10;
vector<pii>E[maxn];
int dis[maxn];
bool vis[maxn];
struct node{
	int dis,pos;
	bool operator< (const node &x)const{
		return x.dis<dis;
	}
};
void dijkstra(int s){
	priority_queue<node>q;
	dis[s]=0;
	q.push((node{0,s}));
	while(!q.empty()){
		int u=q.top().pos;
		q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(pii i:E[u]){
			int v=i.fi,w=i.se;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				q.push((node){dis[v],v});
			}
		}
	}
}
void solve(){
	int m,n,s;cin>>n>>m>>s;
	for(int i=1;i<=n;i++)dis[i]=0x3f3f3f3f;
	while(m--){
		int u,v,w;
		cin>>u>>v>>w;
		E[u].push_back(mkp(v,w));
	}
	dijkstra(s);
	for(int i=1;i<=n;i++)cout<<dis[i]<<' ';
}
signed main(){
	int t;t=1;while(t--){
		solve();
	}
	return 0;
}

标签:cnt,edg,int,spfa,vis,dijkstra,maxn,dis
From: https://www.cnblogs.com/lyrrr/p/18408712

相关文章

  • 【算法笔记】单源最短路问题——Dijkstra算法(无优化/优先队列/set优化)
    0.前言Dijkstra算法可在\(\mathcalO(m\logm)\)或\(\mathcalO(m\logn)\)的时间内求解无负权单源最短路问题。本文中,我们将详细介绍算法的原理、实现,以及常用的两种优化。另外,Dijkstra算法也不要乱用,比如说多源的最短路,用Dijkstra求解的复杂度只有\(\mathcalO(nm\logm)\),但......
  • MATLAB实现Dijkstra算法和Floyd算法
    目录1、文件功能介绍2、代码执行效果展示3、Dijkstra算法求图的单源最短路径4、DijkstrafullPath的更新逻辑5、DIjkstra算法流程图6、Floyd算法实现图的任意两点间最短路径7、Floyd算法流程图8、FloydfullPath的更新逻辑(非递归算法)1、文件功能介绍代码文件功能wor......
  • 信息学奥赛初赛天天练-86-NOIP2014普及组-基础题5-球盒问题、枚举算法、单源最短路、D
    1NOIP2014普及组基础题521把M个同样的球放到N个同样的袋子里,允许有的袋子空着不放,问共有多少种不同的放置方法?(用K表示)()例如,M=7,N=3时,K=8;在这里认为(5,1,1)和(1,5,1)是同一种放置方法。问:M=8,N=5时,K=()22如图所示,图中每条边上的数字表示该边的长度,则从......
  • 信息学奥赛初赛天天练-86-NOIP2014普及组-基础题5-球盒问题、枚举算法、单源最短路、D
    信息学奥赛初赛天天练-86-NOIP2014普及组-基础题5-球盒问题、枚举算法、单源最短路、Dijkstra算法、Bellman-Ford算法PDF文档公众号回复关键字:202409081NOIP2014普及组基础题521把M个同样的球放到N个同样的袋子里,允许有的袋子空着不放,问共有多少种不同的放置方法?(......
  • [USACO3.2] 香甜的黄油 Sweet Butter(Dijkstra)
     FarmerJohn发现了做出全威斯康辛州最甜的黄油的方法:糖。把糖放在一片牧场上,他知道NNN只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。当然,他将付出额外的费用在奶牛上。FarmerJohn很狡猾。像以前的Pavlov,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特......
  • AcWing852.spfa判断负环
    cnt数组表示:cnt【j】表示边j#include<iostream>#include<cstring>#include<algorithm>#include<queue>#defineN2010#defineM10010usingnamespacestd;intn,m;inth[N],w[M],e[M],ne[M],idx;intdis[N],cnt[N];boolst[N];voidadd(inta,i......
  • 求两点间最短路的Dijkstra算法及其matlab程序详解
    #################本文为学习《图论算法及其MATLAB实现》的学习笔记#################设源点为u0u_{0}u0​,目标......
  • Dijkstra's algorithm All In One
    Dijkstra'salgorithmAllInOne迪杰斯特拉算法DijkstraDijkstra'salgorithm(/ˈdaɪkstrəz/DYKE-strəz)isanalgorithmforfindingtheshortestpathsbetweennodesinaweightedgraph,whichmayrepresent,forexample,roadnetworks.Dijkstra算法是一种......
  • 基于A*算法、Dijkstra算法的路径规划研究(Matlab代码实现)
      ......
  • Bellmanford与Spfa解决存在负边权的单源汇最短路问题
    上个文章讲了Dijkstra算法但是Dijkstra算法只能解决单源汇非负边权的最短路问题这次文章来讲单源汇存在负边权的解决方法Bellmanforda和spfa算法二者适用场景区别:一般来说使用spfa就能解决大部分的问题,但问题出现不超过k条边的时候应当使用Bellmanford算法BellmanFord:随意存......