最短路径专题
作者:互联网
Floyd模板
#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
int n,m,x,y,a,b,w,f[maxn][maxn];
int main(){
cin>>n>>m>>x>>y;
memset(f,0x3f,sizeof(f));
for(int i=1;i<=m;i++)cin>>a>>b>>w,f[a][b]=w,f[b][a]=w;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
cout<<f[x][y];
}
Spfa模板
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,m,x,y,a,b,w,tot,head[maxn],dis[maxn],vis[maxn];
queue<int>q;
struct edge{
int to,next,w;
}e[maxn];
void add(int a,int b,int w){
e[++tot].next=head[a];
e[tot].w=w;
e[tot].to=b;
head[a]=tot;
}
void Spfa(){
memset(dis,0x3f,sizeof(dis));
dis[x]=0;
q.push(x);
vis[x]=1;
while(!q.empty()){
int tmp=q.front();
q.pop();
vis[tmp]=0;
for(int i=head[tmp];i;i=e[i].next){
if(dis[e[i].to]>dis[tmp]+e[i].w){
dis[e[i].to]=dis[tmp]+e[i].w;
if(!vis[e[i].to])q.push(e[i].to),vis[e[i].to]=1;
}
}
}
}
int main(){
cin>>n>>m>>x>>y;
for(int i=1;i<=m;i++)cin>>a>>b>>w,add(a,b,w);//add(b,a,w);
Spfa();
//for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
cout<<dis[y];
return 0;
}
Dijkstra模板
#include<bits/stdc++.h>
using namespace std;
const int maxn=4*1e5+5;
const int maxm=1e5+5;
int n,m,head[maxn],a,b,w,tot,dis[maxn],vis[maxn];
struct edge{
int to,next,w;
}g[maxn];
struct node{
int i,dis;
bool operator < (const node tmp)const{
return tmp.dis<dis;
}
};
void add(int a,int b,int w){
g[++tot].to=b;
g[tot].next=head[a];
g[tot].w=w;
head[a]=tot;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++)cin>>a>>b>>w,add(a,b,w);
memset(dis,0x3f,sizeof(dis));
dis[1]=0;
priority_queue<node>q;
q.push((node){1,0});
while(!q.empty()){
node temp=q.top();
q.pop();
//cout<<temp.i<<" "<<temp.dis<<endl;
int now=temp.i;
if(vis[now]==1) continue;
vis[now]=1;
for(int i=head[now];i;i=g[i].next){
int next=g[i].to;
if(dis[next]>dis[now]+g[i].w){
dis[next]=dis[now]+g[i].w;
q.push((node){next,dis[next]});
}
}
}
cout<<dis[n];
//for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
}
次短路模板
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
const int M=200000+10;
int head[M],cnt;
struct node
{
int v,w,nxt;
}edge[M];
struct edg{
int i,dis;
bool operator < (const edg tmp)const{
return tmp.dis<dis;
}
};
int dis1[5005];
int dis2[5005];
void add(int x,int y,int w)
{
edge[++cnt].nxt=head[x];
edge[cnt].v=y;
edge[cnt].w=w;
head[x]=cnt;
}
void Dijkstra(int x)
{
memset(dis1,INF,sizeof(dis1));
memset(dis2,INF,sizeof(dis2));
priority_queue<edg>qu;
dis1[x]=0;//最短路初始值为0,次短路无穷大
qu.push((edg){x,0});
while(!qu.empty( ))
{
int w=qu.top( ).dis;//弹出最小值,或许是最短路,或许是次短路
int u=qu.top( ).i;
qu.pop( );
if(dis2[u]<w)//弹出来的值比当前的次短路大,就可以跳过这个
{
continue;
}
for(int i=head[u];i;i=edge[i].nxt)
{
int v=edge[i].v;
int cost=w+edge[i].w;//u到v的花费
if(dis1[v]>cost)//花费大于原来的最小值,更新最短路
{
swap(dis1[v],cost);//交换值
qu.push((edg){v,dis1[v]});//压入队列
}
if(dis2[v]>cost&&cost>dis1[v])//交换次短路
{
swap(dis2[v],cost);
qu.push((edg){v,dis2[v]});//压入队列,之所以次短路要压入队列是因为后面更新需要。
//例子:dis[2] = 10, dis2[2] = 20 有一条边 2 到 6 的边权值为 5
//如果不把 dis2 入队,那么之后的算法中 dis[6] = 15, dis2[6] = INF
//只有当队列里有 20 这个值,才能 20+5 得出 25,然后更新 dis2[6] = 25
}
}
}
}
int main( ){
int n,r;
scanf("%d%d",&n,&r);
int x,y,w;
for(int i=1;i<=r;i++){
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
add(y,x,w);
}
Dijkstra(1);
printf("%d",dis2[n]);
return 0;
}
标签:dis2,专题,int,路径,head,tot,最短,maxn,dis 来源: https://blog.csdn.net/qq_46258139/article/details/112989548