hdu6395 /// 优先队列dijkstra

Posted zquzjx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu6395 /// 优先队列dijkstra相关的知识,希望对你有一定的参考价值。

题目大意:

给定无向图的n m为点数和边数

接下来m行给定u v id表示点u到点v间有一条编号为id的边

当由一条边走到另一条边 而两条边的编号不同时 费用+1

 

优先队列跑dijkstra最短路 按费用排序

技术图片
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define mem(i,j) memset(i,j,sizeof(i))
#define P pair<int,int>
#define mp make_pair
#define fir first
#define sec second
#define pb push_back
const int N=1e5+5;

int n,m;
vector<P>G[N];
struct NODE {
    int u,d,id,fa;
    bool operator <(const NODE& p)const {
        return d>p.d;
    }
};
int dis[N];

void dijkstra() {
    priority_queue<NODE>q;
    while(!q.empty()) q.pop();
    q.push({1,0,0,-1}); dis[1]=0;
    while(!q.empty()) {
        NODE e=q.top(); q.pop();
        int u=e.u;
        if(u==n) break;
        for(int i=0;i<G[u].size();i++) {
            P t=G[u][i];
            int v=t.fir;
            if(u==v) continue;
            if(dis[v]>dis[u]+(t.sec!=e.id)) {
                dis[v]=dis[u]+(t.sec!=e.id);
                q.push({v,dis[v],t.sec,u});
            }
        }
    }
}

void init() {
    mem(dis,INF);
    for(int i=1;i<=n;i++) G[i].clear();
}

int main()
{
    while(~scanf("%d%d",&n,&m)) {
        init();
        while(m--) {
            int u,v,id;
            scanf("%d%d%d",&u,&v,&id);
            G[u].pb(mp(v,id));
            G[v].pb(mp(u,id));
        }
        dijkstra();
        if(dis[n]==INF) printf("-1
");
        else printf("%d
",dis[n]);
    }

    return 0;
}
View Code

 

以上是关于hdu6395 /// 优先队列dijkstra的主要内容,如果未能解决你的问题,请参考以下文章

最短路 dijkstra+优先队列+临接表

Dijkstra 算法运行时的区别:优先队列与双向链表

Dijkstra算法介绍及其优先队列优化和斐波那契堆优化

最短路Dijkstra+ 链式前向星+ 堆优化(优先队列)

HDU-6395多校7 Sequence(除法分块+矩阵快速幂)

hdu6395 /// 分块矩阵快速幂