<题目链接>

题目大意:
给定一张无向图,有n个点m条边,从一条边到另一条边,如果两边的指不同 花费就要+1,如果相同就不需要花费。 先从1走到n问最小花费是多少。(第一条边的花费都是1)

解题分析:

开始还以为类似于Dijkstra这样的贪心过程是伪的,但是本题确实是dijkstra,不过需要进行一些巧妙的变形,用一个set记录到达每个点的最优花费的所有的路径的前一条边(因为到达一个点的最优路径可能有多条),主要用于判断下一步花费是否需要+1。

//set[u]表示当前的u距离最短时,u的前一条边所有种类
#include <bits/stdc++.h>
using namespace std; const int N = 1e5+ , M = 2e5+;
const int INF = 0x3f3f3f3f;
#define REP(i,s,t) for(int i=s;i<=t;i++)
int n,m;
int vis[N]; struct Edge{ int to,nxt,val; }e[M<<];
int cnt,head[N];
set<int>s[N]; inline void init(){
cnt=;
for(int i=;i<=n;i++)s[i].clear();
memset(head,-,sizeof(head));
}
inline void add(int u,int v,int w){
e[++cnt]=(Edge){ v,head[u],w };head[u]=cnt;
} struct Node{
int loc,dist;
bool operator < (const Node & tmp)const{
return dist>tmp.dist;
}
}node[N]; void Dij(){
priority_queue<Node>q;
REP(i,,n){
vis[i]=,node[i].loc=i,node[i].dist=INF;
}
node[].dist=;
q.push(node[]);
while(!q.empty()){
int u=q.top().loc;q.pop();
if(vis[u])continue;
vis[u]=;
for(int i=head[u];~i;i=e[i].nxt){
int v=e[i].to;
int w;
if(s[u].count(e[i].val))w=node[u].dist;
else w=node[u].dist+;
if(node[v].dist>w){
node[v].dist=w;
s[v].clear(); //因为v点的最优花费发生更新,所以这里需要清空
s[v].insert(e[i].val);
q.push(node[v]);
}
else if(node[v].dist==w){
s[v].insert(w);
}
}
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
init();
REP(i,,m){
int u,v,w;scanf("%d%d%d",&u,&v,&w);
add(u,v,w);add(v,u,w);
}
Dij();
if(node[n].dist==INF)puts("-1");
else printf("%d\n",node[n].dist);
}
}

HDU 6386 Age of Moyu (最短路+set)的更多相关文章

  1. HDU 6386 Age of Moyu 【BFS + 优先队列优化】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6386 Age of Moyu Time Limit: 5000/2500 MS (Java/Others ...

  2. HDU 6386 Age of Moyu

    Problem Description Mr.Quin love fishes so much and Mr.Quin’s city has a nautical system,consisiting ...

  3. hdu 6386 Age of Moyu (重边判断)

    本来用一个map判重边结果T了, 实际上可以直接给边上打标记即可 int n, m; struct _ {int to,w,vis;}; vector<_> g[N]; int dis[N ...

  4. HDU - 6386 Age of Moyu 2018 Multi-University Training Contest 7 (Dijkstra变型)

    题意:N个点M条边的无向图,每条边都有属于自己的编号,如果一条路径上的边编号都相同,那么花费仅为1:改变至不同编号的路径,花费加1,无论这个编号之前是否走过. 分析:记录每个点的最小花费,再用set维 ...

  5. HDU - 6386 Age of Moyu (双端队列+bfs)

    题目链接 双端队列跑边,颜色相同的边之间的花费为0,放进队首:不同的花费为1,放进队尾. 用Dijkstra+常数优化也能过 #include<bits/stdc++.h> using n ...

  6. HDU 6395 分段矩阵快速幂 HDU 6386 建虚点+dij

    http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others)    Me ...

  7. hdu6386 Age of Moyu【最短路】

    Age of Moyu Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) To ...

  8. Age of Moyu HDU - 6386 (杭电多校7A)

    给出n和点,m条边,每条边有各自的标号,进入第一个标号需要消耗1的费用,此后转换标号需要1费用,在同一个标号上走不需要费用.问你从1到n最少需要多少费用. 最短路变形,把第一个点看成不存在的标号,然后 ...

  9. HDU 5637 Transform 单源最短路

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5637 题意: http://bestcoder.hdu.edu.cn/contests/contes ...

随机推荐

  1. python常用模块学习1

    import time time.sleep(1)#暂停时间 time.time()#显示当前系统时间戳 t=time.localtime()#结构化当地时间,可以将结构化时间想象成一个类 print ...

  2. Read-Only Tables 只读表

    Put  a table into read-only  mode,which prevents DDL or DML changes during table maintenance Put the ...

  3. vue 概念与使用vue-cli脚手架快速构建项目

    vue 定义:是一套构建用户界面的渐进式框架,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合. 数据渲染机制: 核心: 响应式数据绑定 ...

  4. 前端每日实战:37# 视频演示如何把握好 transition 和 animation 的时序,创作描边按钮特效

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/mKdzZM 可交互视频教程 此视频 ...

  5. 16.go语言基础学习(上)——2019年12月16日

    2019年12月13日10:35:20 1.介绍 2019年10月31日15:09:03 2.基本语法 2.1 定义变量 2019年10月31日16:12:34 1.函数外必须使用var定义变量 va ...

  6. java基础复习(四)

    ---恢复内容开始--- 一.for循环的掌握  语法格式: for( 初始化语句A   ;  条件判断B  ;  循环后功能语句C){ //循环体D } for的执行流程:   整个for循环结构中 ...

  7. 定时任务crond

    在服务器上使用crond完成定时操作很方便, 下面简单记录一下. 常用的命令主要有以下三个: (1)编辑定时任务 crontab -e (2)   查看定时任务 crontab -l (3)  删除定 ...

  8. 使用linkedlist封装简单的先进先出队列

    创建一个类Queue代表队列(先进先出),添加add(Object obj) 及get()方法, 并添加main()方法进行验证 思路: 使用LinkedList实现队列,在向LinkedList中添 ...

  9. JS自定义随机键盘

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. discuz x3.2设置注册邮件激活_企业邮箱发送邮件失败

    在discuz x2.5邮箱设置里面已经说了很多关于邮件设置和常见问题的处理办法了,今天这里主要是说明下Discuz! 邮件发送失败排查思路,适用于任何板块的Discuz程序. Discuz! 邮件发 ...