最短路算法 Dijkstra Bellman-ford 应用

前言

博客里前面几篇文章已经介绍了 这两个算法的原理问题(floyd算法比较简单 而且制约性比较大 这里 就先从重要的开始) 这里 我们由原理转向应用!
当然这个问题背景是非常简单的 简单的问题 运用熟练了 在比较困难的问题下稍作转化
就可以游刃有余的解决了!

后续 我会不断完善这套代码

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=2544

AC代码

这其中有两个函数 一个是用堆优化的Djkstra算法 和Bellman-Ford 算法 数据都是以邻接表结构存储的
一直在用邻接矩阵 转换为邻接表 刚开始 还真有那么点混乱 但是理清了 这个数据结构之间的关系就OK了

解题思路

这个题其实任何一种算法都可以做出来 只是我们在这做一个优化 为了 这个代码能够解决更多的题目


#include<iostream>
#include<vector>
#include<queue> 
using namespace std;
const int maxp=100+10;
const int maxl=20000+10;
const int inf = 1e7;
int mark[maxp];
int minway[maxp];
int n,m;
//ps: 当时在写这个结构体的时候 遇到了 很多问题 花了很长时间才解决的!
//自定义结构体 point
重载了 < 运算符  和= 运算符  便于 我们能够可以直接给point 对象直接赋值和 比较大小  
这个小于其实是优先队列里面需要用到的
struct point 
{
    int v;
    int w;
    point(int v,int w):v(v),w(w)
    {
        ;
    }
    void operator =(const point& a)
    {
        //return point(a.v,a.w);?aê2?′?ò??μ??y??ê???μ?
         v=a.v;
         w=a.w; 
    }
    bool operator <(const point &a)const
    {
        return w>a.w;
    }

};
//定义邻接表 二维的!
//当然也可以 这样定义 vector<point> map[maxp];
//但是 这一种速度 慢于 下面这一种 具体原因 县不解释 orz(我也是看文章上说的 回来再验证)
vector<vector<point> > map;
void dijkstra()//
{
    //初始化 
    map.resize(maxp);
    for(int i=0;i<maxp;i++)
    {
        mark[i]=0;
        minway[i]=inf;
    }
    map.clear();
    point temp(1,1);
    //优先队列 一定要用一次初始化 !!!
    //因为优先队列 没有清空函数 只能自己pop() 或者直接定义一个新的!
    //就是这样一个 初始化问题 耗费了 我七八个小时!!!
    priority_queue<point> pq;
    pq.push(point(1,0));//加入 源点
    while(!pq.empty())
    {
        temp=pq.top();
        pq.pop();
        if(mark[temp.v])
            continue;
        mark[temp.v]=1;
        minway[temp.v]=temp.w;
        for(int i=0;i<map[temp.v].size();i++)
        {
            int v= map[temp.v][i].v;
            int w= map[temp.v][i].w;
            if(mark[v])
                continue;
            if(minway[v]>temp.w+w)
            {
                minway[v]=temp.w+map[temp.v][i].w;
                pq.push(point(v,minway[v]));
            }   
        }
    }
}
void bellman_ford()
{


    minway[1]=0;
    for(int j=1;j<n;j++)
    for(int i=1;i<=n;i++)
    {
        for(int k=0;k<map[i].size();k++)
        {
            int v=map[i][k].v;
            int w=map[i][k].w;
            if(minway[i]<inf)
            {
                minway[v]=min(minway[v],minway[i]+w);
            }
        }
    }
}
void floyd()
{
    //因为这一种 比较不适合 用邻接表 我就没写 
}
int main()
{
    //freopen("C:\\Users\\12893\\Desktop\\in.txt","r",stdin);
    point temp(1,1);

    while(1)
    {

        cin>>n>>m;
        if(n==0||m==0)
        return 0;

        map.resize(maxp);
        for(int i=1;i<maxp;i++)
        {
            mark[i]=0;
            minway[i]=inf;
        }
        map.clear();

        while(m--)
        {
            int x,y,w;
            cin>>x>>y>>w;
            map[x].push_back(point(y,w));
            map[y].push_back(point(x,w));

        }
        bellman_ford();
        cout<<minway[n]<<endl;
    }

    return 0;
 } 

但是在写这份代码的时候 出现了 各种问题 差点GG还好有 厕神帮我找到了问题 嘿嘿 你们应该会认识 厕神吧 !

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/u011932817/article/details/76162505
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞