其他分享
首页 > 其他分享> > 最短路径专题

最短路径专题

作者:互联网

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