zoukankan      html  css  js  c++  java
  • 1381:城市路(Dijkstra)--模板题

    http://ybt.ssoier.cn:8088/problem_show.php?pid=1381

    方法一:邻接矩阵存图写法

    #include<cstdio>
    #include<cstring>
    #define inf 0x3f3f3f3f
    int m, n;
    int a, b, c;
    int g[2005][2005];
    int dis[2005], vis[2005];
    inline int read()
    {
        int x=0, f=1;  char ch=getchar();
        while(ch<'0' || ch>'9'){ if(ch=='-')f=-1; ch=getchar();}
        while(ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar();}
        return x*f;
    }
    void dijs(int s)
    {
        for(int i=1; i<=n; i++)dis[i]=g[s][i];
        dis[s]=0;
        vis[s]=1;
        for(int i=1; i<n; i++)
        {
            int mindis=inf, temp;
            for(int j=1; j<=n; j++)
            {
                if(vis[j]==0&&dis[j]<mindis)
                {
                    mindis=dis[j];
                    temp=j;
                }
            }
            vis[temp]=1;
            for(int j=1; j<=n; j++)
            {
                if(dis[j]>dis[temp]+g[temp][j])
                    dis[j]=dis[temp]+g[temp][j];
            }
        }
        
    }
    int main()
    {
        n=read(); m=read();
        memset(g, inf, sizeof(g));
        for(int i=1; i<=n; i++)g[i][i]=0;
        for(int i=1; i<=m; i++)
        {
            a=read(); b=read(); c=read();
            if(g[a][b]>c)
            g[a][b]=g[b][a]=c;  //注意无向图存储两次 
        }
        dijs(1);
        if(dis[n]==inf)printf("-1");
        else printf("%d",dis[n]);
        
        return 0;
    }

    方法二:邻接表(vector)存图写法

    #include<cstdio>
    #include<cstring>
    #include<vector>
    using namespace std;
    #define inf 0x3f3f3f3f
    int m, n;
    int s, t, d;
    int dis[200005], vis[200005];
    inline int read()
    {
        int x=0, f=1;  char ch=getchar();
        while(ch<'0' || ch>'9'){ if(ch=='-')f=-1; ch=getchar();}
        while(ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar();}
        return x*f;
    }
    struct node{
        int u;int v; int w;
    }E;
    vector <node> edge[400005];
    void dijs(int s)
    {
        memset(dis, 0x3f, sizeof(dis));
        for(int j=0; j<edge[s].size(); j++)
        {
            E=edge[s][j];
            if(dis[E.v]>E.w)dis[E.v]=E.w;//多条边存储最短 
        }    
    
        dis[s]=0;vis[s]=1;
        //for(int i=1; i<=n; i++)printf("%d ",dis[i]);
        
        for(int i=1; i<n; i++)
        {
            int mindis=inf, mins;
            for(int j=1; j<=n; j++)
            {
                if(vis[j]==0 && dis[j]<mindis)
                {
                    mindis=dis[j];
                    mins=j;
                }
            }
            vis[mins]=1;
            for(int j=0; j<edge[mins].size(); j++)//此处要比邻接矩阵快,时间复杂度为m 
            {
                E=edge[mins][j];
                if(dis[E.v]>dis[mins]+E.w && vis[E.v]==0)//此处vis[E.v]必须写,容易忘掉 
                    dis[E.v]=dis[mins]+E.w;
            }    
        }
    }
    int main()
    {
        
        n=read(); m=read();
        for(int i=1; i<=m; i++)
        {
            s=read();t=read();d=read();
            E.v=t;E.w=d;
            edge[s].push_back(E);
            E.v=s;E.w=d;
            edge[t].push_back(E);        //注意此处无向图存两遍        
        }
        
    //    for(int i=1; i<=n; i++)
    //    {
    //        for(int j=0; j<edge[i].size(); j++)
    //        {
    //            E=edge[i][j];
    //            printf("%d-%d=%d
    ",i,E.v,E.w);
    //        }
    //        
    //    }
        dijs(1);
        printf("%d",dis[n]);
        
        return 0;
    }
  • 相关阅读:
    Appium元素定位方式
    Selenium和Appium的关系
    再生龙备份恢复
    删除CentOS更新后的旧内核
    文字识别网站https://ocr.space/
    kubeasz部署高可用kubernetes1.17.2 并实现traefik2.1.2部署 亲测可用
    docker之Dockerfile实践用dockerfile构建nginx环境
    WordPress如何设置先登录再进入主页
    docker 容器使用 systemctl 命令是报错
    bilibili
  • 原文地址:https://www.cnblogs.com/tflsnoi/p/10387966.html
Copyright © 2011-2022 走看看