C--最短路(Bellman-Ford算法)

C–最短路

Time Limit: 7000MS Memory Limit: 65536KB
Submit Statistic
Problem Description

给出一个带权无向图,包含n个点,m条边。求出s,e的最短路。保证最短路存在。
Input

多组输入。
对于每组数据。
第一行输入n,m(1<= n && n<=5*10^5,1 <= m && m <= 2*10^6)。
接下来m行,每行三个整数,u,v,w,表示u,v之间有一条权值为w(w >= 0)的边。
最后输入s,e。
Output

对于每组数据输出一个整数代表答案。
Example Input

3 1
1 2 3
1 2
Example Output

3
Hint

Author

zmx

时间复杂度:O(NM);
适用范围:
1.单源最短路径
2.有向图和无向图
3.边权可正可负
4.差分约束系统

类似这一道题目,二维数组存不下的不能用Floyed 和Dijkstra,可以使用Bellman-Ford

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 10000000
#define INF 0x3f3f3f3f
int v[MAXN], u[MAXN], dist[MAXN], w[MAXN];
int main()
{
    int n, m, a, b, c, s, e, t;
    while(~scanf("%d %d", &n, &m))
    {
        t = 1;//记录边数,由于是无向图,t=m*2
        for(int i=1;i<=m;i++)
        {
            scanf("%d %d %d", &a, &b, &c);
            u[t] = a, v[t] = b, w[t] = c;
            t++;
            u[t] = b, v[t] = a, w[t] = c;
            t++;
        }
        m = m*2;
        scanf("%d %d", &s, &e);
        for(int i=1;i<=n;i++)
        {
            dist[i] = INF;//初始化dist数组
        }
        dist[s] = 0;
        int f;//标记
        for(int i=0;i<n-1;i++)
        {
            f = 0;
            for(int j=1;j<=m;j++)
            {
                if(dist[v[j]]>dist[u[j]]+w[j])
                {
                    dist[v[j]]=dist[u[j]]+w[j];
                    f = 1;
                }
            }
            if(f==0)//当不能再松弛时,跳出
                break;
        }
        printf("%d\n", dist[e]);
    }
    return 0;
}

SPFA:

同样的代码,用gcc交,就过了,用g++就RE
我觉得以后,该是什么就用什么交,不要一律用g++,不然以后一定还会出错…………
……………………………………

#include <stdio.h>
#include <string.h>
#define INF 0x3f3f3f3f
int tp, op;
int book[500023], link[500023];
int dist[500023], u[4000023], v[4000023], w[4000023];
int main()
{
    int n, m, a, b, c, s, e, k, t;
    while(~scanf("%d %d", &n, &m))
    {
        tp = op = 0;
        memset(book, -1, sizeof(book));
        memset(link, 0, sizeof(link));

        t = 1;
        for(int i=1;i<=m;i++)
        {
            scanf("%d %d %d", &a, &b, &c);
            u[t] = a, v[t] = b, w[t] = c;
            t++;
            u[t] = b, v[t] = a, w[t] = c;
            t++;
        }

        scanf("%d %d", &s, &e);
        for(int i=1;i<=n;i++)
        {
            dist[i] = INF;
        }
        dist[s] = 0;

        m = m*2;
        link[tp++] = v[s];
        book[s] = 1;
        while(op<tp)
        {
            op++;
            k = link[op];
            while(k<=m)
            {
                if(dist[v[k]]>dist[u[k]]+w[k])
                {
                    dist[v[k]] = dist[u[k]] + w[k];
                    if(book[k]==0)
                    {
                        link[tp++] = v[k];
                        book[v[k]] = 1;
                    }
                }
                k++;
            }
        }
        printf("%d\n", dist[e]);
    }
    return 0;
}

/***************************************************
User name: 
Result: Accepted
Take time: 916ms
Take Memory: 1840KB
Submit time: 
****************************************************/
#include <stdio.h>
#include <string.h>
#define INF 0x3f3f3f3f
int tp, op;
int book[500023], link[500023];
int dist[500023], u[4000023], v[4000023], w[4000023];
int main()
{
    int n, m, a, b, c, s, e, k, t;
    while(~scanf("%d %d", &n, &m))
    {
        tp = op = 0;
        memset(book, -1, sizeof(book));
        memset(link, 0, sizeof(link));

        t = 1;
        for(int i=1;i<=m;i++)
        {
            scanf("%d %d %d", &a, &b, &c);
            u[t] = a, v[t] = b, w[t] = c;
            t++;
            u[t] = b, v[t] = a, w[t] = c;
            t++;
        }

        scanf("%d %d", &s, &e);
        for(int i=1;i<=n;i++)
        {
            dist[i] = INF;
        }
        dist[s] = 0;

        m = m*2;
        link[tp++] = v[s];
        book[s] = 1;
        while(op<tp)
        {
            op++;
            k = link[op];
            while(k<=m)
            {
                if(dist[v[k]]>dist[u[k]]+w[k])
                {
                    dist[v[k]] = dist[u[k]] + w[k];
                    if(book[k]==0)
                    {
                        link[tp++] = v[k];
                        book[v[k]] = 1;
                    }
                }
                k++;
            }
        }
        printf("%d\n", dist[e]);
    }
    return 0;
}

/***************************************************
User name: 
Result: Runtime Error
Take time: 0ms
Take Memory: 0KB
Submit time: 
****************************************************/
    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/FEATHER2016/article/details/76528034
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞