首页 > 其他分享 >hdu:最短路(堆优化的dijkstra)

hdu:最短路(堆优化的dijkstra)

时间:2023-01-06 14:57:17浏览次数:33  
标签:node hdu int 短路 cnt dijkstra edge now dis

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<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。

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


输入样例

2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
 

输出样例

3
2
附带ac代码
#include<bits/stdc++.h>
using namespace std;
const int N=110,M=1e4+10,INF=0x3f3f3f3f;
int head[M],dist[N],cnt,vis[N];
struct _edge{
    int to,dis,next;
}edge[M];
struct node{
    int id,dis;
    friend bool operator < (const node T1,const node T2)
    {
        return T1.dis>T2.dis;
    }
};
void add_edge(int from,int to,int dis)
{
    edge[++cnt].to=to;
    edge[cnt].dis=dis;
    edge[cnt].next=head[from];
    head[from]=cnt;
}
void dij(int n)
{
    priority_queue<node> q;
    q.push(node{1,0});
    while(!q.empty())
    {
        node a=q.top();q.pop();
        int now=a.id;
        if(vis[now]) continue;
        vis[now]=1;
        for(int i=head[now];i;i=edge[i].next)
        {
            int j=edge[i].to;
            if(dist[now]+edge[i].dis<dist[j])
            {
                dist[j]=dist[now]+edge[i].dis;
                q.push(node {j,dist[j]});
            }
        }
    }
}
int main()
{
    int n,m,a,b,c;
    while(scanf("%d%d",&n,&m)==2,n)
    {
        for(int i=2;i<=n;++i)
            dist[i]=INF;
        dist[1]=0;
        cnt=0;
        memset(edge,0,sizeof(edge));
        memset(head,0,sizeof(head));
        memset(vis,0,sizeof(vis));
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&c);
            add_edge(a,b,c);
            add_edge(b,a,c);
        }
        dij(n);
        printf("%d\n",dist[n]);
    }
}

 

 

标签:node,hdu,int,短路,cnt,dijkstra,edge,now,dis
From: https://www.cnblogs.com/ruoye123456/p/17030466.html

相关文章

  • hdu: 张煊的金箍棒(3)(树状数组的区间修改,区间查询)
    ProblemDescription张煊的金箍棒升级了!升级后的金箍棒是由N段相同长度的金属棒连接而成(最开始每段金属棒的价值都是1,从1到N编号);张煊作为金箍棒的主人,可以对金箍棒任意......
  • 蓝桥真题——最短路 & 门牌制作
    题目1最短路标签:填空题2019省赛如下图所示,G是一个无向图,其中蓝色边的长度是1、橘色边的长度是2、绿色边的长度是3。则从A到S的最短距离是多少?答案由图可......
  • hdu:sort it(逆序对,离散化)
    ProblemDescription给定n(n<=100000)个正整数,希望对其从小到大排序,如果采用冒泡排序算法,请计算需要进行的交换次数。Input输入包含多组测试用例,每组用例由两行组成:第一行......
  • HDU 6439 2018CCPC网络赛 Congruence equationI(杜教筛 + 莫比乌斯反演 + 伯努利数)
      大致题意:给你一个长度为k的序列a。对于序列c,当  时,;当时,取[0,m)中任意一个数字。令  表示满足  的序列c的方案数。现在让你求 。          ......
  • 贪心算法Dijkstra
    Dijkstra最短路径问题:给定一个带权有向图G=(V,E,W),同时给定一个源点u(u∈V),我们要找出从源点u出发到其它各点的最短路径距离,并得出这些最短路径的具体路径......
  • 算法之Floyd-Warshall算法【c++】【图论】【最短路】
    我们作为刚学图论的小蒟蒻,先接触到的算法一定是图上最短路径算法。而最短路算法中最简单的当属Floyd-Warshall算法。下面是一些基本介绍:​该算法可以计算图上任意两点间......
  • HDU 6801 Game on a Circle 题解 (推式子,多项式)
    题目链接首先注意到我们对这个环的扫描是一轮一轮进行的,每轮都会从左到右对每个没被删除的元素以p的概率删除。如果我们能对每个\(t(t\in[0,\infin],t是整数)和i\)求出c......
  • hdu:color the ball(差分数组)
    ProblemDescriptionN个气球排成一排,从左到右依次编号为1,2,3….N.每次给定2个整数ab(a<=b),lele便为骑上他的“小飞鸽”牌电动车从气球a开始到气球b依次给每个气球涂......
  • hdu:敌兵布阵(树状数组)
    ProblemDescriptionC国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就......
  • HDU 1712 ACboy needs your help
    HDU1712ACboyneedsyourhelp题意:一共有\(n\)轮,给出在每一轮中,选择\(y\)份获得的价值。现在一共可以选择\(m\)份,求最终获得的最大价值是多少。思路:其实相当......