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 ...
随机推荐
- Linux 查找指定内容在哪个文件中
在实际的工作中,忘记配置项放在哪个文件中时,可借助命令来查询. eg: 1.grep -r "查询内容" 文件目录 #这样查询出来的包括文件名+内容 grep -r -l ...
- RabbitMQ拓展学习 自定义配置RabbitMQ连接属性
最近研究RabbitMQ从本地获取配置,主要场景是RabbitMQ的连接配置如:ip地址这些需要从外部的配置服务器获取.面对这个问题,有两个解决方案,一个是用RabbitMQ原生的连接方式,但是如果使 ...
- 通过反射获取方法的参数名称(JDK8以上支持)
方法的参数名,在很多时候我们是需要反射得到的.但是在java8之前,代码编译为class文件后,方法参数的类型是固定的,但参数名称却丢失了,这和动态语言严重依赖参数名称形成了鲜明对比.(java是静态 ...
- Vue 组件间的传值(通讯)
组件之间的通讯分为三种 父给子传 子给父传 兄弟组件之间的通讯 1 父组件给子组件传值 子组件嵌套在父组件内部,父组件给子组件传递一个标识,在子组件内部用props接收,子组件在模板里可以通过{{}} ...
- LOJ6300 BZOJ5283 [CodePlus 2018 3 月赛]博弈论与概率统计
一道好题!很久以前就想做了,咕到了现在,讲第二遍了才做. 首先我们观察到$p$是没有用的 因为赢的次数一定 那么每一种合法序列出现的概率均为$p^n*(1-p)^m$ 是均等的 我们可以不看它了 然后 ...
- 给mongodb设置密码
内容来自:https://segmentfault.com/a/1190000011554055 mongodb安装后是无需密码 Mongodb安装后自身是没有密码的,用户连接只需填写id地址,端口号 ...
- What are the differences between an LES-SGS model and a RANS based turbulence model?
The biggest difference between LES and RANS is that, contrary to LES, RANS assumes that \(\overline{ ...
- Task6.神经网络基础
BP: 正向计算loss,反向传播梯度. 计算梯度时,从输出端开始,前一层的梯度等于activation' *(与之相连的后一层的神经元梯度乘上权重的和). import torch from tor ...
- @property属性装饰器
顾名思义,@property就是一个跟属性相关的装饰器, 使用了它之后,取值和赋值操作都变得简洁 from datetime import date, datetime class User: def ...
- 在Mac电脑上安装linux系统
1.首页需要下载VMware fusion (百度一下) 2.Ubuntu 镜像文件(.iso) 连接:http://www.jb51.net/LINUXjishu/239493.html 3.打开 ...