前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >spfa(链式前向星)+dijkstra(链式前向星)

spfa(链式前向星)+dijkstra(链式前向星)

作者头像
全栈程序员站长
发布于 2022-11-17 02:32:07
发布于 2022-11-17 02:32:07
51400
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

链式前向星

链式前向星可以存图, 它存图的方式是: 将 任 意 一 个 节 点 的 所 有 临 边 按 输 入 顺 序 依 次 连 接 起 来 将任意一个节点的所有临边按输入顺序依次连接起来 将任意一个节点的所有临边按输入顺序依次连接起来 然 后 头 节 点 ( 数 组 ) 存 的 是 最 后 一 个 临 边 的 地 址 然后头节点(数组)存的是最后一个临边的地址 然后头节点(数组)存的是最后一个临边的地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int head[maxn];//head[i]中i是u->v中的u,head[i]存的是这个头节点对应的最后临边的地址
int cnt//cnt是edge[cnt]中edge的地址
struct node{ 
   
  int w;//u->v中的边权
  int e;//u->v中的v
  int next;//就是用next让这个头节点下面的全部临边相连
}edge[maxn];
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void add(int u,int v,int w){ 
   
  edge[cnt].w=w;
  edge[cnt].e=v;
  edge[cnt].next=head[u];//就是这一步让这个头节点下面的全部临边相连
  head[u]=cnt++;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100501
struct NODE{ 

int w;
int e;
int next;
}edge[MAXN];
int cnt;
int head[MAXN];
void add(int u,int v,int w){ 

edge[cnt].w=w;
edge[cnt].e=v;  
edge[cnt].next=head[u];
head[u]=cnt++;
}
int main(){ 

memset(head,0,sizeof(head));
cnt=1;
int n;
cin>>n;
int a,b,c;
while(n--){ 

cin>>a>>b>>c;
add(a,b,c);
}
int start;
cin>>start;
for(int i=head[start];i!=0;i=edge[i].next)
cout<<start<<"->"<<edge[i].e<<" "<<edge[i].w<<endl;
return 0;
}

深度理解链式前向星 https://blog.csdn.net/acdreamers/article/details/16902023

spfa

我 理 解 s p f a 是 在 图 上 跑 的 可 回 头 的 b f s 我理解spfa是在图上跑的可回头的bfs 我理解spfa是在图上跑的可回头的bfs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<math.h>
#include<vector>
#include<iostream>
#define INF 0x3f3f3f3f
#define ll long long
#define N 100000+10
using namespace std;
int n,m;
int x,y,z;
struct node
{ 

int y,z;
};
vector<node> mp[1000];
int spfa(int b,int e)
{ 

bool color[1000];
int d[1000];
memset(color,0,sizeof(color));
memset(d,INF,sizeof(d));
d[b]=0;
queue<int>q;
q.push(b);
color[b]=1;
while(!q.empty())
{ 

int st=q.front();
q.pop();
color[st]=0;//这里就是和bfs的唯一区别,bfs没有这里,所以color表示的就是这个点有没有进过,进过就不用进了
//spfa里color表示的是队列里有没有st,要是有的话就不用进了
for(int i=0;i<mp[st].size();i++)
{ 

if(d[st]+mp[st][i].z<d[mp[st][i].y])
{ 

d[mp[st][i].y]=d[st]+mp[st][i].z;
if(!color[mp[st][i].y])
{ 

q.push(mp[st][i].y);
color[mp[st][i].y]=1;
}
}
}
}
return d[e];
}
int main()
{ 

scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
{ 

scanf("%d%d%d",&x,&y,&z);
mp[x].push_back((node){ 
y,z});
mp[y].push_back((node){ 
x,z});
}
cout<<spfa(1,n)<<endl;
}

SPFA详解 https://blog.csdn.net/hlg1995/article/details/70242296

spfa(链式前向星)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<math.h>
#include<vector>
#include<iostream>
using namespace std;
#define INF 0x3f3f3f
#define maxn 10010
struct node{ 

int w;
int e;
int next;
}edge[maxn];
int cnt,t,n;
int head[maxn];
void init(){ 

memset(head,0,sizeof head);
cnt=1;
}
void add(int u,int v,int w){ 

edge[cnt].w=w;
edge[cnt].e=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
int spfa(){ 

queue<int> q;
bool color[maxn];
int d[maxn];
memset(d,INF,sizeof d);
memset(color,true,sizeof color);
q.push(1);
d[1]=0;
color[1]=false;
while(!q.empty()){ 

int st=q.front();
q.pop();
color[st]=true;
for(int i=head[st];i!=0;i=edge[i].next){ 

if(d[st]+edge[i].w<d[edge[i].e]){ 

d[edge[i].e]=d[st]+edge[i].w;
if(color[edge[i].e]){ 

q.push(edge[i].e);
color[edge[i].e]=false;
}
}
}
}
return d[n];
}
int main(){ 

while(~scanf("%d %d", &t, &n)){ 

init();
int u,v,w;
for(int i=0;i<t;i++){ 

scanf("%d %d %d", &u, &v, &w);
add(u,v,w);
add(v,u,w);
}
printf("%d\n", spfa());
}
return 0;
}
dijkstra

我 理 解 d i j k s t r a 实 际 上 是 B F S + 贪 心 我理解dijkstra实际上是BFS+贪心 我理解dijkstra实际上是BFS+贪心

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <algorithm>
#include <string.h>
#include <queue>
#define INF 0x3f3f3f
#define maxn 1005
using namespace std;
int n;
vector< pair<int,int> >mp[maxn];
int dijkstra(int b,int e){ 

priority_queue< pair<int,int> > p;//有限队列存最小节点(默认优先级较大)
int d[maxn];//用于记录起点s到v的最短路
memset(d,INF,sizeof(d));
d[b]=0;
p.push(make_pair(0,b));//起点
while(!p.empty()){ 

pair<int,int> f = p.top();
p.pop();
int u=f.second;
if(d[u] < f.first*(-1)) continue;
for(int j=0; j<mp[u].size(); j++){ 

int v=mp[u][j].first;
if(d[v]>d[u]+mp[u][j].second){ 

d[v]=d[u]+mp[u][j].second;
p.push(make_pair(d[v]*(-1),v));// priority_queue(默认优先级较大)所以要*-1;
}
}
}
return d[e];
}
int main(){ 

cin>>n;
int k,c,u,v;
for(int i=0;i<n;i++){ 

cin>>u>>k;
for(int j=0;j<k;j++){ 

cin>>v>>c;
mp[u].push_back(make_pair(v,c));
}
}
printf("%d\n", dijkstra(1,n));
return 0;
}

最短路径问题—Dijkstra算法详解 https://blog.csdn.net/qq_35644234/article/details/60870719

dijkstra(链式前向星)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <algorithm>
#include <cstring>
#include<cstdio>
#include <queue>
#define INF 0x3f3f3f
#define maxn 10010
using namespace std;
struct Time{ 

int w, e;
bool operator < (const Time& t)const{ 

return w > t.w;
}
};
struct node{ 

int w;
int e;
int next;
}edge[maxn];
int cnt,t,n;
int head[maxn];
void init(){ 

memset(head,0,sizeof head);
cnt=1;
}
void add(int u,int v,int w){ 

edge[cnt].w=w;
edge[cnt].e=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
int dijkstra(){ 

priority_queue<Time> q;
int d[maxn];
memset(d,INF,sizeof d);
d[1]=0;
q.push(Time{ 
0,1});
while(!q.empty()){ 

Time st=q.top();
q.pop();
if(d[st.e]<st.w) continue;
for(int i=head[st.e];i!=0;i=edge[i].next){ 

if(d[st.e]+edge[i].w<d[edge[i].e]){ 

d[edge[i].e]=d[st.e]+edge[i].w;
q.push(Time{ 
d[edge[i].e],edge[i].e});
}
}
}
return d[n];
}
int main(){ 

while(~scanf("%d %d", &t, &n)){ 

init();
int u,v,w;
for(int i=0;i<t;i++){ 

scanf("%d %d %d", &u, &v, &w);
add(u,v,w);
add(v,u,w);
}
printf("%d\n", dijkstra());
}
return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/226940.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ZOJ 3794 Greedy Driver spfa
以下Q行 u v 表示在u点有销售站,能够卖掉邮箱里的随意数量的油,每以单位v元。
全栈程序员站长
2022/07/12
1850
Tricks Device (hdu 5294 最短路+最大流)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 124 Accepted Submission(s): 27
全栈程序员站长
2022/07/10
2250
Educational Codeforces Round 54 (Rated for Div. 2) D. Edge Deletion(dijkstra+bfs)
题目链接:http://codeforces.com/contest/1076/problem/D
Ch_Zaqdt
2019/01/10
3760
POJ 3259 Wormholes(spfa判负环)
       题意是有n个点,m条边,k个虫洞(权值为负),输入完m条无向边后输入k条有向边,问能不能找到一个点,从这个点出发,最后回到这个点的时候权值是负的(时光倒流)。
Ch_Zaqdt
2019/01/10
8020
POJ 2449 Remmarguts' Date(k短路模板)
       题意是n个点,m条边,然后输入m条边,最后输入起始点和终止点和第k短路。
Ch_Zaqdt
2019/01/10
5640
HDU 2544 最短路(链式前向星+dijkstra优先队列优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 第一次用队列优化加链式前向星,所以找了道模板题来练手,体验感不错.. AC代码: #includ
Ch_Zaqdt
2019/01/11
7830
洛谷P4779 【模板】单源最短路径(标准版)
前几天写dijkstra的时候没打vis标记居然A了,然后天真的我就以为Dijkstra不用打标记。
attack
2018/07/27
5640
图论--关于最长路的探讨
最短路的求法,有很多,Floyd、Dijkstra、Bellma-Ford,但是我们来思考一下最长路,SPFA和Floyd必然可以跑最长路,一个是DP,一个是基于更新的更新,所以由于这两种特性,决定了他们能够跑最长路,但是最不会被卡的Dijkstra在这里就显得蹩脚了。 为什么?我们来看一下这种情况:
风骨散人Chiam
2020/10/28
5900
图论--关于最长路的探讨
HDU 1874 畅通工程续 dijkstra+priority_queue
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
ACM算法日常
2019/03/18
4110
算法基础学习笔记——⑪拓扑排序\最短路
时间复杂度 平均情况下 O(m),最坏情况下 O(nm), n 表示点数,m 表示边数
命运之光
2024/03/20
1650
算法基础学习笔记——⑪拓扑排序\最短路
HDU 2923 Einbahnstrasse(dijkstra)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2923        题意是输入n,c,r,表示有n个城市,c个坏了的车,r条路,然后输入一个地名表示当
Ch_Zaqdt
2019/01/11
3460
POJ 1847 Tram(详细题意+dijkstra)
        题意是输入n,a,b三个数,表示有n个点(1-n),起点是a,终点是b,然后接下来有n行,每一行的第一个数m表示后面将会有m个数,输入结构是这样的,然后我再具体的解释一下。
Ch_Zaqdt
2019/01/11
4640
2017.11.7解题报告
预计分数:100+0+40=140 实际分数:100+0+0=100 震惊!出题人的一张机票可以用无限次 T1https://www.luogu.org/problem/show?pid=T16500
attack
2018/04/11
6300
2017.11.7解题报告
The 2019 Asia Nanchang First Round Online Programming Contest B Fire-Fighting Hero(阅读理解)
This is an era of team success, but also an era of heroes. Throughout the ages, there have been numerous examples of using the few to defeat the many. There are VV (Numbers 11 to VV) fire-fighting points in ACM city. These fire-fighting points have EE roads to communicate with each other. Among them, there is a fire-fighting hero in the SS fire-fighting point, and the fire-fighting team is distributed in K fire-fighting points. If a fire-fighting point needs to be put out, the fire-fighting hero or the fire-fighting team must arrive as soon as possible, that is, to choose the shortest route to arrive.
风骨散人Chiam
2020/10/28
2640
[2019HDU多校第一场][HDU 6582][E. Path]
题意: t 组样例,n个点,m条边。i 行a到b距离c. 要求去掉最短路的最小代价。去掉每条路代价等于长度。
用户2965768
2019/08/01
2980
洛谷P4768 [NOI2018]归程(Kruskal重构树)
哎,调了一上午也没调出来,只有72分,可以过所有的单个数据,但是一起跑就GG,而且我本机跑大数据会RE。
attack
2018/07/27
3030
喊山第二部_demjanov重排
喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是彝族先民用来求援呼救的“讯号”,慢慢地人们在生活实践中发现了它的实用价值,便把它作为一种交流工具世代传袭使用。(图文摘自:http://news.xrxxw.com/newsshow-8018.html)
全栈程序员站长
2022/09/22
2810
HDU 6181 Two Paths(次短路+dijkstra)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6181        题意是有两个人比赛,第一个人一定会走最短路,问第二个人最短走多远(不能与最短路路径
Ch_Zaqdt
2019/01/10
6340
洛谷P2045 方格取数加强版(费用流)
对于拆出来的每个点,在其中连两条边,一条为费用为点权,流量为1,另一条费用为0,流量为INF
attack
2019/03/05
3550
《图》相关刷题
用户11039529
2024/04/10
930
相关推荐
ZOJ 3794 Greedy Driver spfa
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档