zoukankan      html  css  js  c++  java
  • 最短路径算法(跟新SPFA,Ford)

    //以城市路为蓝本介绍算法

    1381:城市路(Dijkstra)


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

    【题目描述】

    罗老师被邀请参加一个舞会,是在城市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

    SPAF:

    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
        int next,to,val;
    }edge[200005];
    int h[2001],num=0;
    void add_edge(int from,int to,int val)
    {
        num++;
        edge[num].to=to;
        edge[num].val=val;
        edge[num].next=h[from];
        h[from]=num;
    }
    int dis[2001];
    bool used[2001];
    int Q[1000005],head,tail;
    int main()
    {
        int n,m;
        cin>>n>>m;
    
        for(int i=1;i<=m;i++)
        {
            int x,y,z;
            cin>>x>>y>>z;
            add_edge(x,y,z);
            add_edge(y,x,z);
        }
        
        memset(dis,0x3f,sizeof(dis));
        dis[1]=0;
        Q[1]=1;head=1;tail=1;used[1]=true;    
        while(head<=tail)
        {
            //1.取出头结点
            int from=Q[head];
            head++;
            used[from]=false;
            //2.拓展新的尾结点 
            for(int j=h[from];j!=0;j=edge[j].next)
            {
                int to=edge[j].to;
                int val=edge[j].val;
                if(dis[to]>dis[from]+val)
                {
                    dis[to]=dis[from]+val;
                    if(!used[to])
                    {
                        tail++;
                        Q[tail]=to;
                        used[to]=true;
                    }
                }
            }
            
        }
        
        if(dis[n]==0x3f3f3f3f)
            cout<<-1;
        else        
            cout<<dis[n];        
                
        return 0;
    }

    Ford:

    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
        int from,to,val;
    }edge[20005];
    int num;
    void add_edge(int from,int to,int val)
    {
        num++;
        edge[num].from=from;
        edge[num].to=to;
        edge[num].val=val;
    }
    int dis[2001];
    int main()
    {
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=m;i++)
        {
            int x,y,z;
            cin>>x>>y>>z;
            add_edge(x,y,z);
        }
        memset(dis,0x3f,sizeof(dis));
        dis[1]=0;
        
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=num;j++)
            {    
                int from=edge[j].from;
                int to=edge[j].to;
                int val=edge[j].val;
                dis[to]=min(dis[to],dis[from]+val);
                dis[from]=min(dis[from],dis[to]+val);
            } 
        }
        
        if(dis[n]==0x3f3f3f3f)
            cout<<-1;
        else
            cout<<dis[n];
        return 0;
    }

    //~~可能并不能过。。。。~~

  • 相关阅读:
    [转]被玩坏的innerHTML、innerText、textContent和value属性
    在github上优雅的搭建个人博客
    使用jmeter进行压力测试入门讲解
    一、docker 入坑(win10和Ubuntu 安装)
    使用C#开发Android应用之WebApp
    Win10上的Docker应用:Kubernetes(容器集群)
    Win10上的Docker应用:Docker-compose(容器编排)
    Win10上的Docker应用:Hello World
    在web端使用html5访问远程桌面
    HtmlAgilityPack
  • 原文地址:https://www.cnblogs.com/crazily/p/11207235.html
Copyright © 2011-2022 走看看