AtCoder arc061C Snuke's Subway Trip
大意:
给你一张无向图,边有种类。
当你第一次/重新进入某种边时费用 + 1
在同一种边之间行走无费用。
求 1 到 n 的最小费用。
嗯...乍一看有一个很直观的想法:记录每个点的最短路的上一条边的种类。
但是这个算法是个错的......有些数据能够hack掉。
由于边权只有0 & 1,考虑01BFS。
事实上我们还要记录每个点来之前的边,然后就要写结构体/pair
然后还要判重...
正解:考虑按照每个点的边的type拆点。
在不同点的同一type分点之间边权为0
原点与拆出来的点之间边权为1
然后跑01BFS即可。
开n个map来存点的分点编号。
map 的 count 用法(虽然没啥卵用)
我照着正解写了个过了,然后写了自己的想法就WA.....
不知道为什么。对拍可能生成的数据太弱了,全是符合的。
#include <cstdio>
#include <map>
#include <deque> const int N = ; int cnt; std::map<int, int> mp[N]; struct Edge {
int v, nex, len;
}edge[N << ]; int top; int e[N], dis[N], vis[N]; inline int get(int x, int type, int &f) {
if(mp[x][type]) {
f = ;
return mp[x][type];
}
f = ;
return mp[x][type] = ++cnt;
} inline void add(int x, int y, int z) {
++top;
edge[top].v = y;
edge[top].len = z;
edge[top].nex = e[x];
e[x] = top++;
edge[top].v = x;
edge[top].len = z;
edge[top].nex = e[y];
e[y] = top;
return;
} inline int BFS(int s, int t) {
vis[s] = ;
dis[s] = ;
std::deque<int> Q;
Q.push_back(s);
while(!Q.empty()) {
int x = Q.front();
Q.pop_front();
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(vis[y]) {
continue;
}
dis[y] = dis[x] + edge[i].len;
if(y == t) { /// error : y == s
return dis[y];
}
vis[y] = ;
if(edge[i].len) {
Q.push_back(y);
}
else {
Q.push_front(y);
}
}
}
return -;
} int main() {
freopen("in.in", "r", stdin);
freopen("my.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
cnt = n;
for(int i = , x, y, z, f; i <= m; i++) {
scanf("%d%d%d", &x, &y, &z);
int x_type = get(x, z, f);
if(f) {
add(x, x_type, );
}
int y_type = get(y, z, f);
if(f) {
add(y, y_type, );
}
add(x_type, y_type, );
} int ans = BFS(, n);
printf("%d", ans >> ); return ;
}
AC代码
#include <cstdio>
#include <map>
#include <deque> const int N = ; std::map<int, int> mp[N]; struct Edge {
int v, nex, type;
}edge[N << ]; int top; int e[N]; inline void add(int x, int y, int z) {
top++;
edge[top].v = y;
edge[top].type = z;
edge[top].nex = e[x];
e[x] = top;
return;
} struct Poi {
int id, dis, pre;
Poi(int id, int dis, int pre) {
this->id = id;
this->dis = dis;
this->pre = pre;
}
}; inline int BFS(int s, int t) {
std::deque<Poi> Q;
Q.push_back(Poi(s, , ));
while(!Q.empty()) {
Poi x = Q.front();
Q.pop_front();
for(int i = e[x.id]; i; i = edge[i].nex) {
int y = edge[i].v;
int len = edge[i].type == x.pre ? : ;
if(y == t) {
return x.dis + len;
}
if(mp[y][edge[i].type]) {
continue;
}
mp[y][edge[i].type] = ;
if(len) {
Q.push_back(Poi(y, x.dis + , edge[i].type));
}
else {
Q.push_front(Poi(y, x.dis, x.pre));
}
}
}
return -;
} int main() {
int m, n;
scanf("%d%d", &n, &m);
for(int i = , x, y, z; i <= m; i++) {
scanf("%d%d%d", &x, &y, &z);
add(x, y, z);
add(y, x, z);
} int t = BFS(, n);
printf("%d", t); return ;
}
WA代码
AtCoder arc061C Snuke's Subway Trip的更多相关文章
- AtCoder ARC061E Snuke's Subway Trip 最短路
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门 Portal 原题目描述在最下面. \(n(1 ...
- 【例题收藏】◇例题·I◇ Snuke's Subway Trip
◇例题·I◇ Snuke's Subway Trip 题目来源:Atcoder Regular 061 E题(beta版) +传送门+ 一.解析 (1)最短路实现 由于在同一家公司的铁路上移动是不花费 ...
- Snuke's Subway Trip
すぬけ君の地下鉄旅行 / Snuke's Subway Trip Time limit : 3sec / Memory limit : 256MB Score : 600 points Problem ...
- 2018.09.19 atcoder Snuke's Subway Trip(最短路)
传送门 就是一个另类最短路啊. 利用颜色判断当前节点的最小花费的前驱边中有没有跟当前的边颜色相同的. 如果有这条边费用为0,否则费用为1. 这样跑出来就能ac了. 代码: #include<bi ...
- [ARC061E]すぬけ君の地下鉄旅行 / Snuke's Subway Trip
题目大意:Snuke的城镇有地铁行驶,地铁线路图包括$N$个站点和$M$个地铁线.站点被从$1$到$N$的整数所标记,每条线路被一个公司所拥有,并且每个公司用彼此不同的整数来表示. 第$i$条线路($ ...
- ARC061E Snuke's Subway Trip
传送门 题目大意 已知某城市的地铁网由一些地铁线路构成,每一条地铁线路由某一个公司运营,该城市规定:若乘坐同一公司的地铁,从开始到换乘只需要一块钱,换乘其他公司的价格也是一块钱,问从1号地铁站到n号地 ...
- atcoder C - Snuke and Spells(模拟+思维)
题目链接:http://agc017.contest.atcoder.jp/tasks/agc017_c 题解:就是简单的模拟一下就行.看一下代码就能理解 #include <iostream& ...
- AtCoder AGC017C Snuke and Spells
题目链接 https://atcoder.jp/contests/agc017/tasks/agc017_c 题解 很久前不会做看了题解,现在又看了一下,只想说,这种智商题真的杀我... 转化成如果现 ...
- AtCoder 杂题训练
前言: 因为要普及了,今年没一等就可以退役去学文化课了,所以暑假把历年noip普及组都刷了一遍,离noip还有50+天,想弄点强化训练什么的. 想了想,就这些天学文化课之余有空就把AtCoder之前那 ...
随机推荐
- java回调机制——基本理解
回调(diao):往回调用,反向调用. 英文 call back.call:调用,back:返回,往返. 回调的意思就是杀个回马枪...... 回调(callback),既然是往回调用,那自然有一个正 ...
- Navicat Preminum
此软件在连接的时候,需要这样: 新建链接==>连接属性==>编码选择自动==>如果此时点击确定的话,会把整个服务器的所有数据库都打开, 我们也可以只打开指定的数据库, 点击高级==& ...
- shiro框架的UsernamePasswordToken与对应Realm中的AuthenticationToken的一点比较
这里以简单的登陆为例子 控制器对应的登陆方法: @RequestMapping(value = "/login", method = RequestMethod.GET) publ ...
- VM虚拟机截图方法介绍
可以先安装QQ之类的截图软件,但比较麻烦,而且截图之后还需要安装VMware Tools等工具才能拿到物理机上 先定向到物理机,快捷键为CTRL+ALT,之后在用qq截图快捷键ctrl+alt+a即可 ...
- BZOJ2738矩阵乘法——整体二分+二维树状数组
题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5 ...
- Django ORM模型
Object Relational Mapping(ORM) 一,ORM介绍 1, ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象 ...
- [洛谷P1730] 最小密度路径
类型:Floyd 传送门:>Here< 题意:定义一条路径密度 = 该路径长度 / 边数.给出一张$DAG$,现有$Q$次询问,每次给出$X,Y$,问$X,Y$的最小密度路径($N \le ...
- 不同版本的Chrom浏览器对应的ChromDriver的版本
附chromedriver与chrome的对应关系表: chromedriver版本 支持的Chrome版本 v2.40 v66-68 v2.39 v66-68 v2.38 v65-67 v2.37 ...
- centos6.8下安装matlab2009(图片转帖)
前言 如何优雅的在centos6.8上安装matlab2009. 流程 不过我个人安装过程完后启动matlab的时候又出现了新问题: error while loading shared librar ...
- 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树
题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...