• Floyd && Dijkstra +邻接表 +链式前向星(真题讲解来源:城市路)


    1381:城市路(Dijkstra)


    时间限制: 1000 ms         内存限制: 65536 KB
    提交数: 4066     通过数: 1163 

    【题目描述】

    罗老师被邀请参加一个舞会,是在城市n,而罗老师当前所处的城市为1,附近还有很多城市2~n-1,有些城市之间没有直接相连的路,有些城市之间有直接相连的路,这些路都是双向的,当然也可能有多条。

    现在给出直接相邻城市的路长度,罗老师想知道从城市1到城市n,最短多少距离。

    【输入】

    输入n, m,表示n个城市和m条路;

    接下来m行,每行a b c, 表示城市a与城市b有长度为c的路。

    【输出】

    输出1到n的最短路。如果1到达不了n,就输出-1。

    【输入样例】

    5 5
    1 2 20
    2 3 30
    3 4 20
    4 5 20
    1 5 100

    【输出样例】

    90

    【提示】

    【数据规模和约定】

    1≤n≤2000

    1≤m≤10000

    0≤c≤10000

    【来源】


    No

    Floyd:(被省略了。。。。)

    Dijkstra:

    #include<bits/stdc++.h>
    using namespace std;
    int g[2005][2005];
    int n,m;
    int dis[2005];
    bool used[2005];
    int main(){
        memset(g,0x3f,sizeof(g));
        cin>>n>>m;
        for(int i=1;i<=m;++i){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            g[a][b]=min(g[a][b],c);
            g[b][a]=min(g[b][a],c);
        }
        memset(dis,0x3f,sizeof(dis));
        dis[1]=0;
        for(int i=1;i<=n;++i){
            int minn=0x3f3f3f3f,minn_j=0;
            for(int j=1;j<=n;++j){
                if(used[j]==false&&dis[j]<minn){
                    minn=dis[j];
                    minn_j=j;
                }
            }
            if(minn_j==0)
                break;
            used[minn_j]=true;
            for(int j=1;j<=n;j++)
                if(used[j]==false)
                    dis[j]=min(dis[j],dis[minn_j]+g[minn_j][j]);
        }
        if(dis[n]==0x3f3f3f3f)
        cout<<-1;
        else
        cout<<dis[n];
    }

    +领接表:

    #include<bits/stdc++.h>
    using namespace std;
    struct node{
        int to,val;
    };
    vector<node> edge[2005];
    
    int dis[2005];
    bool used[2005];
    int main(){
        int n,m;
        cin>>n>>m;
        int a,b,c;
        for(int i=1;i<=m;i++){
            cin>>a>>b>>c;
            node t;
            t.to=b;t.val=c;
            edge[a].push_back(t);
            t.to=a;t.val=c;
            edge[b].push_back(t);
        }
        memset(dis,0x3f,sizeof(dis));
        dis[1]=0;
        for(int i=1;i<=n;i++){
             int minn=0x3f3f3f3f,minn_j=0;
            for(int j=1;j<=n;j++){
                if(used[j]==false&&dis[j]<minn){
                    minn=dis[j];
                    minn_j=j;
                }
            }
            if(minn_j==0)
                break;
            used[minn_j]=true;
            int from=minn_j;
            for(int j=0;j<edge[from].size();j++){
                int to=edge[from][j].to;
                int val=edge[from][j].val;    
                dis[to]=min(dis[to],dis[from]+val);
            }
            
        }
                    
        if(dis[n]==0x3f3f3f3f)
            cout<<-1;
        else
            cout<<dis[n];
        
        return 0;
    }

    +链式前向星:

    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
        int to,val,next;
    };
    node edge[20005];
    
    int dis[2005];
    bool used[2005];
    int head[2005];
    int num=0;
    void add_edge(int from,int to,int val)
    {
        num++;
        edge[num].to=to;
        edge[num].val=val;
        edge[num].next=head[from];
        head[from]=num;
    }
    
    int main()
    {
        int n,m;
        cin>>n>>m;
        int a,b,c;
        for(int i=1;i<=m;i++)
        {
            cin>>a>>b>>c;
            add_edge(a,b,c);
            add_edge(b,a,c);
        }
        
        memset(dis,0x3f,sizeof(dis));
        memset(used,false,sizeof(used));
        dis[1]=0;
        for(int i=1;i<=n;i++)
        {
            int minn=0x3f3f3f3f,minn_j=0;
            for(int j=1;j<=n;j++)
            {
                if(used[j]==false && dis[j]<minn)
                {
                    minn=dis[j];
                    minn_j=j;
                }
            }
            if(minn_j==0)
                break;
            used[minn_j]=true;
            int from=minn_j;
            for(int j=head[from];j!=0;j=edge[j].next)
            {
                int to=edge[j].to;
                int val=edge[j].val;
                dis[to]=min(dis[to],dis[from]+val);
            }
        }
                    
        if(dis[n]==0x3f3f3f3f)
            cout<<-1;
        else
            cout<<dis[n];
        
        return 0;
    }

     

  • 相关阅读:
    nor flash之4字节地址模式
    DroidVim:在安卓手机上使用vim
    从linux命令行分享文件:bashupload.com和transfer.sh
    记一个实时Linux的中断线程化问题
    nor flash之写保护开销
    第七届开源操作系统会议(OS2ATC 2019)见闻及资料分享
    nor flash之擦除和写入
    PyCharm 远程调试代码
    【图像分析】形态学
    【强化学习】DQN 算法改进
  • 原文地址:https://www.cnblogs.com/crazily/p/10990732.html
Copyright © 2020-2023  润新知