ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

最短路径算法(跟新SPFA,Ford)

2019-07-18 14:55:28  阅读:296  来源: 互联网

标签:num val int 城市 最短 SPFA edge Ford dis


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

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;
}

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

 

标签:num,val,int,城市,最短,SPFA,edge,Ford,dis
来源: https://www.cnblogs.com/crazily/p/11207235.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有