HDU - 6386 Age of Moyu 2018 Multi-University Training Contest 7 (Dijkstra变型)
题意:N个点M条边的无向图,每条边都有属于自己的编号,如果一条路径上的边编号都相同,那么花费仅为1;改变至不同编号的路径,花费加1,无论这个编号之前是否走过。
分析:记录每个点的最小花费,再用set维护这个最小花费对应的前驱边的编号,可能有多个不同的前驱编号。如果当前状态可以更新点最小花费,那么将set清空并加入前驱编号;如果与最小花费相等且前驱的编号不在集合中,那么将前驱的状态加入集合中。
*BFS要用优先队列,否则会错。
#include<bits/stdc++.h>
using namespace std;
const int maxn =1e5+;
const int INF = 0x3f3f3f3f;
struct Edge{
int v,id,next;
}edges[maxn<<];
int head[maxn],tot;
int d[maxn];
set<int> sta[maxn]; void init()
{
tot=;
memset(head,-,sizeof(head));
} void AddEdge(int u,int v,int id)
{
edges[tot] = (Edge){v,id,head[u]};
head[u] = tot++;
} struct Node{
int val,u;
int pre,fa;
bool operator <(const Node &p) const{return val>p.val;}
};
void BFS(int s,int t)
{
memset(d,INF,sizeof(d));
d[s] = ;
priority_queue<Node> Q;
Q.push((Node){d[s],s,-,-});
while(!Q.empty()){
Node x= Q.top();Q.pop();
int pre = x.pre, u = x.u;
if(x.val> d[u]) continue;
else if(x.val==d[u]){
bool tag = true;
if(sta[u].find(pre)!=sta[u].end())
continue;
sta[u].insert(pre);
}
else{
d[u] = x.val;
sta[u].clear();
sta[u].insert(pre);
} for(int i=head[u];~i;i=edges[i].next){
int v = edges[i].v,now = edges[i].id;
if(v==x.fa) continue; //反向边
if((d[u]+(pre!=now))<=d[v]){
d[v] = d[u] + (pre!=now);
if(v!=t) Q.push((Node){d[v],v,now,x.u});
}
}
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int N,M;
int u,v,id;
while(scanf("%d%d",&N,&M)==){
for(int i=;i<=N;++i) sta[i].clear();
init();
while(M--){
scanf("%d%d%d",&u,&v,&id);
AddEdge(u,v,id);
AddEdge(v,u,id);
}
BFS(,N);
if(d[N]==INF) d[N]=-;
printf("%d\n",d[N]);
}
return ;
}
HDU - 6386 Age of Moyu 2018 Multi-University Training Contest 7 (Dijkstra变型)的更多相关文章
- 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 (双端队列+bfs)
题目链接 双端队列跑边,颜色相同的边之间的花费为0,放进队首:不同的花费为1,放进队尾. 用Dijkstra+常数优化也能过 #include<bits/stdc++.h> using n ...
- HDU 6386 Age of Moyu (最短路+set)
<题目链接> 题目大意:给定一张无向图,有n个点m条边,从一条边到另一条边,如果两边的指不同 花费就要+1,如果相同就不需要花费. 先从1走到n问最小花费是多少.(第一条边的花费都是1) ...
- HDU 6141 - I am your Father! | 2017 Multi-University Training Contest 8
思路来自 FXXL 最小树形图模板用kuangbin的 /* HDU 6141 - I am your Father! [ 最小树形图 ] | 2017 Multi-University Traini ...
- HDU 4946 Area of Mushroom(2014 Multi-University Training Contest 8)
思路: 只有速度最大才有可能为1,速度不是最大肯定为0,那么就是 只需要操作那些速度最大的点,这些点求一个凸包,判断一下是不是在凸包边上即可. 有几个需要注意的地方: 1.最大速度如果为0 那么肯 ...
- HDU 4939 Stupid Tower Defense (2014 Multi-University Training Contest 7)
思路:首先红色肯定要放在最后面.前面蓝色和绿色dp求解. dp[i][j] 表示前面(i+j) 个 有 i 个蓝色塔 j个绿色塔 能造成最大伤害. //====================== ...
- HDU 4913 Least common multiple(2014 Multi-University Training Contest 5)
题意:求所有自己的最小公倍数的和. 该集合是 2^ai * 3^bi 思路:线段树. 线段树中存的是 [3^b * f(b)] f(b)表示 因子3 的最小公倍数3的部分 为 3^b的个数 ...
随机推荐
- JQ实现吸顶效果代码
吸顶下过代码跟简单几行代码就可以了 如果滚动的军力大于100,就改变导航的定位方式,否则就默认 $(function(){ $(window).scroll(function(){ ...
- 嵌入式驱动开发之解码器tvp5150---tvp5150am1基于8148vpss的添加调试
(1)i2c (2)注册设备 (3)寄存器 --------------author:pkf ------------------------time:2015-4-5 --------------- ...
- Openstack(Kilo)安装系列之Keystone(四)
创建租间.用户.角色 一.To configure prerequisites 1.Configure the authentication token: export OS_TOKEN=ADMIN_ ...
- Linux文件的打包与压缩
打包命令: tar tar 的选项与参数非常的多!我们只讲几个常用的选项,更多选项您可以自行 man tar 查询罗! [root@www ~]# tar [-j|-z] [cv] [-f 创建的档名 ...
- (转)memcache缓存
转自:http://369369.blog.51cto.com/319630/833234/ memcache分布式缓存 Memcache知识点梳理 Memcached概念: Memcached ...
- 说说常见的几个js疑难点
JavaScript match() 方法 定义和使用方法 match() 方法可在字符串内检索指定的值,或找到一个或多个正則表達式的匹配. 该方法类似 indexOf() 和 lastIndexOf ...
- nginx https配置+nginx跳转到万网虚拟主机
server { listen 443 ssl; server_name www.104dh.com 104dh.com; ssl on; ssl_certificate cert104/152678 ...
- 让TextView的drawableLeft与文本一起居中显示
TextView的drawableLeft.drawableRight和drawableTop是一个常用.好用的属性,可以在文本的上下左右放置一个图片,而不使用更加复杂布局就能达到,我也常常喜欢用R ...
- 使用sendmail来发邮件
安装sendEmail sendEmail是一个免费.轻量级.命令行的SMTP邮件客户端. 如果你需要使用命令行方式发送邮件,那么sendEmail是非常完美的选择:使用简单.功能强大. wget - ...
- 【bzoj4872】[Shoi2017]分手是祝愿 数论+期望dp
题目描述 Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 ...