HDU 2544 最短路 SPFA 邻接表 模板

HDU 2544 最短路 SPFA 邻接表 模板

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

Problem Description
在每年的校赛里,全部进入决赛的同学都会获得一件非常美丽的t-shirt。可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以如今他们想要寻找最短的从商店到赛场的路线,你能够帮助他们吗?

 

Input
输入包含多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包含3个整数A,B,C(1<=A,B&lt;=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员须要C分钟的时间走过这条路。

输入保证至少存在1条商店到赛场的路线。

 

Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
 

Sample Input
   
   
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0

 

Sample Output
   
   
3 2 代码:
<pre name="code" class="cpp">#include<iostream>
#include<cstdio>
#include<cstring>
#define maxx 99999999
#include<queue>
using namespace std;
struct node{
   int to,w;
   int pre;  //表示 同一起点的前一条边
}edge[20005];
int vis[505],dis[505];
int next[20005];
int m,n;
int tot;
void addedge(int u,int v,int w)
{
    int j,t=0;
    for(j=next[u];j!=-1;j=edge[j].pre)   //去重边
    {
        if(v==edge[j].to&&w>=edge[j].w)
        {
            t=1;
            break;
        }
    }
    if(t==1)
        return;
    edge[tot].to=v;
    edge[tot].w=w;
    edge[tot].pre=next[u];//  邻接表的存储
    next[u]=tot++;       //
    edge[tot].to=u;  //构造反向边
    edge[tot].w=w;
    edge[tot].pre=next[v];
    next[v]=tot++;
    return;
}
int spfa()
{
    queue<int>q;
    int now;
    for(int i=1;i<=m;i++)
    {
        vis[i]=0;
        dis[i]=maxx;
    }
    dis[1]=0;
    vis[1]=1;
    q.push(1);
    while(!q.empty())
    {
        now=q.front();
        q.pop();
        vis[now]=0;        //反向边
        for(int i=next[now];i!=-1;i=edge[i].pre)  //遍历同一起点的全部边(从最后一条边開始)
        {
            int v=edge[i].to;
            if(dis[v]>dis[now]+edge[i].w)
            {
                dis[v]=dis[now]+edge[i].w;
                if(!vis[v])
                {
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
    return dis[m];
}
int main()
{
    while(~scanf("%d%d",&m,&n))
    {
        if(m==0&&n==0)
        break;
        tot=1;
        memset(next,-1,sizeof(next));
        while(n--)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            addedge(a,b,c);
        }
        int s=spfa();
        cout<<s<<endl;
    }
    return 0;
}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117984.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Log:Spdlog初探(1)

    Log:Spdlog初探(1)文章目录Log:Spdlog初探简介spdlog简介安装/使用Headeronlyversion编译静态库Linux版本Windows版本代码说明设置日志输出样式Log:Spdlog初探简介公司需要开新项目,提议更换日志库,交给我让我调研一下spdlog库的使用。spdlog简介Github地址:Github地址官网介绍:Veryfast,header-only/compile…

    2022年6月23日
    45
  • python2装饰器_python内置装饰器

    python2装饰器_python内置装饰器前言我们都知道装饰器的作用是在不改变原有的代码基础上,添加新的功能,但是这样会有一个弊端,被装饰的函数某些属性会变改变,接下来我们来看下案例importtimedefrun_time(fu

    2022年7月29日
    8
  • Ubuntu安装主题_炫酷的Ubuntu主题

    Ubuntu安装主题_炫酷的Ubuntu主题1优化工具sudoapt-getupdatesudoapt-getinstallgnome-tweak-tool2主题工具sudoapt-getinstallgnome-shell-extensions3配置start:=&amp;amp;gt;stst:=&amp;amp;gt;开始op1:=&amp;amp;gt;应用程序end:=&amp;amp;gt;est-&amp;amp;gt;

    2022年9月24日
    6
  • APP开发防套路秘籍!

    APP开发防套路秘籍!在互联网软件开发行业混迹多年,深知这个行业的水有多深。就拿APP开发来说,市场上APP开发外包公司实在太多了,大中小都应有尽有,稍不留神,就很容易被“不正规”的公司给套路了。为此,整理了一份“三要一不”防套路秘籍,一起来学习下吧!1.要整体外包大多数企业,想要开发一款APP,都会首选外包这种方式。而外包又有两种形式,即整体外包和半外包。顾名思义,整体外包就是将UI、前端、后台都交给一个外包公司…

    2022年5月18日
    31
  • R语言基本画图「建议收藏」

    R语言创建多个图形方法一:每次创建一副新图形之前打开一个新的图形窗口dev.new()画图dev.new()画图……方法二:通过图形用户界面。windows上,打开一个一个图形界面,勾选“历史”——“记录”。然后点击菜单中的“上(下)一个”即可。方法三:使用函数dev.new()、dev.next()、dev.prev()、dev.set()

    2022年4月13日
    327
  • docker镜像操作_docker 本地镜像

    docker镜像操作_docker 本地镜像前言Docker的三大核心概念:镜像、容器、仓库。初学者对镜像和容器往往分不清楚,学过面向对象的应该知道类和实例,这跟面向对象里面的概念很相似我们可以把镜像看作类,把容器看作类实例化后的对象。|

    2022年7月29日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号