(Day11)算法复健运动for蓝桥杯-最短路

(Day11)算法复健运动for蓝桥杯-最短路

1. Dijkstra

真女人就要直接学时间优化版本的Dijkstra

(一般只能算一个点到其他边的最短路)比较局限的一种算法,不能计算负权的

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
const int N=1e5+9;
const int inf=2147483647;
struct node//存图
{
    int t,net,w;
}e[5*N];
int dis[N],head[N],vis[N];
int tot=1;
void add(int x,int y,int w)
{
    e[tot].t=y;
    e[tot].net=head[x];
    e[tot].w=w;
    head[x]=tot++;
}
struct no
{
    int q;//s到哪个点
    int d;
    bool operator<(const no &c)const{
        return d>c.d;
    }
};
void dij(int s)
{
    priority_queue<no>qu;
    no one;
    one.q=s;
    one.d=0;
    qu.push(one);
    while(!qu.empty())
    {
        no now=qu.top();
        qu.pop();
        int x=now.q;
        if(vis[x])continue;//被当做过松弛的最佳点
        vis[x]=1;
        for(int i=head[x];i;i=e[i].net)
        {
            int to=e[i].t;
            if(!vis[to]&&dis[to]>dis[x]+e[i].w)
            {
                dis[to]=dis[x]+e[i].w;
                no nxt;
                nxt.q=to;
                nxt.d=dis[to];
                qu.push(nxt);
            }
        }
    }
}
int main()
{
    int n,m,s;//点数,边数,起点
    cin>>n>>m>>s;
    for(int i=1;i<=n;i++)
    {
        dis[i]=inf;
    }
    int x,y,w;
    while(m--)
    {
        cin>>x>>y>>w;
        add(x,y,w);
    }
    dis[s]=0;
    dij(s);
    for(int i=1;i<=n;i++)
    {
        cout<<dis[i]<<" ";
    }
    cout<<endl;
    return 0;
}

2.Floyd

记住模板就行了

#include<stdio.h>
#include<algorithm>
#define inf 1000000000
using namespace std;
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        int ch[209][209];
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                ch[i][j]=inf;
            }
            ch[i][i]=0;//这一句很重要,没有就WA
        }
        int a,b,x;
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d%d",&a,&b,&x);
            ch[a][b]=min(ch[a][b],x);
            ch[b][a]=min(ch[b][a],x);
        }
        int s,t;
        scanf("%d%d",&s,&t);
        for(int k=0; k<n; k++)//k必须在最外层
        {
            for(int j=0; j<n; j++)
            {
                for(int i=0; i<n; i++)
                {
                    if(ch[i][j]>ch[i][k]+ch[k][j])
                    {
                        ch[i][j]=ch[i][k]+ch[k][j];
                    }
                }
            }
        }
        if(ch[s][t]==inf)ch[s][t]=-1;
        printf("%d\n",ch[s][t]);
    }
    return 0;
}

3. spfa

#include<bits/stdc++.h>
#define inf 2e9
using namespace std;
const int N=5e4+9;
int vis[N];
int head[N];
int dis[N];
int tot;
struct node
{
    int t,w,net;
}e[N];
void add(int x,int y,int w)
{
    e[tot].t=y;
    e[tot].w=w;
    e[tot].net=head[x];
    head[x]=tot++;
}
void spfa()
{
    dis[1]=0;
    vis[1]=1;
    queue<int>qu;
    qu.push(1);
    while(!qu.empty())
    {
        int now=qu.front();
        qu.pop();
        vis[now]=0;
        for(int i=head[now];i;i=e[i].net)
        {
            int b=e[i].t;
            if(dis[b]>dis[now]+e[i].w)
            {
                dis[b]=dis[now]+e[i].w;
                if(!vis[b])
                {
                    vis[b]=1;
                    qu.push(b);
                }
            }
        }
    }
}
int main()
{
    tot=1;
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        dis[i]=inf;
    }
    int u,v,w;
    while(m--)
    {
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
    }
    spfa();
    if(dis[n]==inf)
    {
        printf("-1\n");
    }
    else
    {
        printf("%d\n",dis[n]);
    }
    return 0;
}

posted @   wlqtc  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示