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之前那 ...
随机推荐
- js中style,currentStyle和getComputedStyle的区别以及获取css样式操作方法
用js的style只能获取元素的内联样式,内部样式和外部样式使用style是获取不到的. currentStyle可以弥补style的不足(可获取内联样式,内部样式和外部样式),但是只适用于IE. g ...
- springCloud com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
1.com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: c ...
- python之路--动态传参,作用域,函数嵌套
一 . 动态传参(重点) * , ** * 与 ** * 在形参位置. * 表示不定参数, 接收的是位置参数 接收到的位置参数的动态传参: 都是元组 def eat(*food): # 在形参这里 ...
- 关于WPF中Popup中的一些用法的总结
Popup控件是一个常用的非常有用的控件,顾明思义就是弹出式控件,首先我们来看看MSDN对它的解释吧,表示具有内容的弹出窗口,这个是非常重要的控件,我们看看它的继承关系吧: System.Object ...
- 一、PHP_OSS使用
一.OSS PHP SDK下载 二.文件目录 三.参考手册快速入门对oss操作 以及到控制台找到相应参数并填写
- Eclipse配置C++时的三个关键环境变量
ECLIPSE下载很简单,然后装上MinGW,安装就完成了,关键是要配置三个环境变量 include——C:\MinGW\include lib——C:\MinGW\lib path——C:\MinG ...
- github上传时出现error: src refspec master does not match any解决办法22
1 error:src refspec master does not match any这个问题,我之前也遇到过,这次又遇到了只是时间间隔比较长了,为了防止以后再遇到类似问题,还是把这个方法简单记录 ...
- hdu-4763(kmp+拓展kmp)
题意:给你一个串,问你满足最大字串既是前后缀,也在字符串除去前后缀的位置中出现过: 思路:我用的是拓展kmp求的前后缀,只用kmp也能解,在字符串2/3的位置后开始遍历,如果用一个maxx保存前2/3 ...
- codevs2822
解题思路: tarjan缩点后算出度为0的点有几个,如果只有一个且这个点为爱心天使就行了: #include<iostream> #include<algorithm> #in ...
- Wiener Filter
假设分别有两个WSS process:$x[n]$,$y[n]$,这两个process之间存在某种关系,并且我们也了解这种关系.现在我们手头上有process $x[n]$,目的是要设计一个LTI系统 ...