• 最短路 Dijkstra模板


    普通dijkstra,复杂度O(n*n)

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,f[105][105],dis[105];   
    bool b[105];    //n为总共的点数,m为路径数,f数组记录两个点的距离,dis数组记录每个点到原点的距离 
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            int aa,bb,cc;
            scanf("%d%d%d",&aa,&bb,&cc);
            f[bb][aa]=f[aa][bb]=cc;
        }
        memset(dis,1,sizeof(dis));
        dis[1]=0;
        for(int i=1;i<=n;i++)
            if(f[1][i]) dis[i]=f[1][i];     //将刚开始与1点连接的点路径记录 
        for(int i=1;i<=n;i++){
            int k=0;
            int mn=2<<29;       //一个大数 
            for(int j=1;j<=n;j++){
                if(!b[j] && dis[i]+f[i][j]<mn && f[i][j]){
                    mn=dis[i]+f[i][j];          //记录最短点和路径 
                    k=j;
                }
            }
            if(k==0)    break;
            b[k]=1;
            dis[k]=mn;
            for(int j=1;j<=n;j++)
                if(dis[k]+f[k][j]<dis[j] && f[k][j])    //更新其余点 
                    dis[j]=dis[k]+f[k][j];
        }
        printf("%d",dis[n]);
    }

    堆优化,复杂度O(mlog(n))。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<queue>
    
    using namespace std;
    const int MAXN = 10005,MAXM = 500005;
    
    struct Edge{
        int nxt,to,v;
    }edge[MAXM];
    
    int n,m,st,cnt,head[MAXN],dis[MAXN];
    bool vis[MAXN];
    
    struct cmp{
        bool operator()(int x,int y){
            return dis[x]>dis[y];
        }
    };
    
    inline void add(int bg,int ed,int w){
        edge[++cnt].to=ed;
        edge[cnt].v=w;
        edge[cnt].nxt=head[bg];
        head[bg]=cnt;
    }
    
    inline void dijkstra(){
        priority_queue<int,vector<int>,cmp> q;
        memset(dis,0x3f,sizeof(dis));
        q.push(st);
        dis[st]=0;
        while(!q.empty()){
            int x=q.top();
            q.pop();
            if(vis[x])  continue;
            vis[x]=1;
            for(register int i=head[x];i;i=edge[i].nxt){
                int u=edge[i].to;
                dis[u]=min(dis[u],dis[x]+edge[i].v);
                q.push(u);
            }
        }
    }
    
    int main(){
        scanf("%d%d%d",&n,&m,&st);
        for(register int i=1;i<=m;i++){
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);
        }
        dijkstra();
        for(register int i=1;i<=n;i++)
            printf("%d ",dis[i]);
        return 0;
    }
  • 相关阅读:
    枚举工具类:封装判断是否存在这个枚举
    MYSQL插入emoji报错解决方法Incorrect string value
    文件大小转换带上单位工具类(文件byte自动转KBMBGB)
    mysql 统计七天数据并分组
    mybatis plus 和 druid 版本导致LocalDateTime 不兼容问题
    Layui弹框中select下拉列表赋值回显
    查看环境版本
    Linux 常用命令
    安装jdk14的坑
    modbus_tk解析
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9677223.html
Copyright © 2020-2023  润新知