ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

最短路径专题

2021-01-22 17:02:39  阅读:155  来源: 互联网

标签:dis2 专题 int 路径 head tot 最短 maxn dis


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有