码迷,mamicode.com
首页 > 其他好文 > 详细

hdu6395 /// 优先队列dijkstra

时间:2019-02-10 12:16:53      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:main   fine   air   turn   init   bsp   dijkstra   void   接下来   

题目大意:

给定无向图的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\n");
        else printf("%d\n",dis[n]);
    }

    return 0;
}
View Code

 

hdu6395 /// 优先队列dijkstra

标签:main   fine   air   turn   init   bsp   dijkstra   void   接下来   

原文地址:https://www.cnblogs.com/zquzjx/p/10358962.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!