zoukankan      html  css  js  c++  java
  • 最短路 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;
    }
  • 相关阅读:
    css笔记
    应用软件常用性能数据描述
    软件性能
    对换工作
    微软网络监视器
    神经衰落的治疗方法
    测试工具Loadrunner日志参数的设置与使用 http://epanchen.javaeye.com/blog/317594
    常见的性能测试方法
    web性能测试需要监控IIS的哪些性能指标 http://bbs.51testing.com/thread13221111.html
    应用软件性能数据分类
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9677223.html
Copyright © 2011-2022 走看看