HDU 6386 Age of Moyu (最短路+set)
<题目链接>
题目大意:
给定一张无向图,有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)的更多相关文章
- 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 ...
- HDU 6386 Age of Moyu
Problem Description Mr.Quin love fishes so much and Mr.Quin’s city has a nautical system,consisiting ...
- hdu 6386 Age of Moyu (重边判断)
本来用一个map判重边结果T了, 实际上可以直接给边上打标记即可 int n, m; struct _ {int to,w,vis;}; vector<_> g[N]; int dis[N ...
- HDU - 6386 Age of Moyu 2018 Multi-University Training Contest 7 (Dijkstra变型)
题意:N个点M条边的无向图,每条边都有属于自己的编号,如果一条路径上的边编号都相同,那么花费仅为1:改变至不同编号的路径,花费加1,无论这个编号之前是否走过. 分析:记录每个点的最小花费,再用set维 ...
- HDU - 6386 Age of Moyu (双端队列+bfs)
题目链接 双端队列跑边,颜色相同的边之间的花费为0,放进队首:不同的花费为1,放进队尾. 用Dijkstra+常数优化也能过 #include<bits/stdc++.h> using n ...
- HDU 6395 分段矩阵快速幂 HDU 6386 建虚点+dij
http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others) Me ...
- hdu6386 Age of Moyu【最短路】
Age of Moyu Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) To ...
- Age of Moyu HDU - 6386 (杭电多校7A)
给出n和点,m条边,每条边有各自的标号,进入第一个标号需要消耗1的费用,此后转换标号需要1费用,在同一个标号上走不需要费用.问你从1到n最少需要多少费用. 最短路变形,把第一个点看成不存在的标号,然后 ...
- HDU 5637 Transform 单源最短路
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5637 题意: http://bestcoder.hdu.edu.cn/contests/contes ...
随机推荐
- 一、.Net Core 分块上传文件
一..Net Core 分块上传文件 一.前端实现 @* For more information on enabling MVC for empty projects, visit http://g ...
- readlink 查看符号链接的文件的内容
1. 命令功能 readlink 查看软链接文件里的真实内容. 2. 语法格式 readlink [option] file 参数 参数说明 -f 后跟软链接文件 3. 使用范例 范例1 查看文件链 ...
- oracle 汇编04
General-Purpose Instructions The general-purpose instructions perform basic data movement, memory ad ...
- Vue的自定义滚动,我用el-scrollbar
弄了一个持续更新的github笔记,可以去看看,诚意之作(本来就是写给自己看的--)链接地址:Front-End-Basics 此篇文章的地址:Vue的自定义滚动,我用el-scrollbar 基础笔 ...
- Linux下git安装配置
一.Linux下git安装配置 2013-07-28 20:32:10| 分类: 默认分类 | 标签:linux git server |举报|字号 订阅 http://abomby ...
- [洛谷 P1013] NOIP1998 提高组 进制位
问题描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...
- Centos6安装mysql
此处安装的是MariaDB,介绍如下: MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将My ...
- URL跳转漏洞
URL跳转原理: 由于越来越多的需要和其他第三方应用交互,以及在自身应用内部根据不同的逻辑将用户引向到不同的页面,譬如一个典型的登录接口就经常需要在认证成功之后将用户引导到登录之前的页面,整个过程中如 ...
- BZOJ 4804: 欧拉心算 欧拉函数
Description 给出一个数字N Input 第一行为一个正整数T,表示数据组数. 接下来T行为询问,每行包含一个正整数N. T<=5000,N<=10^7 题解: 求 $\sum_ ...
- [hadoop](1) MapReduce:ChainMapper
前言 本章主要讲述的是对于hadoop生态系统中,MapReduce写的ChainMapper的学习.MapReduce是hadoop集群数据处理的默认框架.而对于数据集中所有的数据必然有一些不友好的 ...