大意:

给你一张无向图,边有种类。

当你第一次/重新进入某种边时费用 + 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的更多相关文章

  1. AtCoder ARC061E Snuke's Subway Trip 最短路

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门  Portal  原题目描述在最下面.  \(n(1 ...

  2. 【例题收藏】◇例题·I◇ Snuke's Subway Trip

    ◇例题·I◇ Snuke's Subway Trip 题目来源:Atcoder Regular 061 E题(beta版) +传送门+ 一.解析 (1)最短路实现 由于在同一家公司的铁路上移动是不花费 ...

  3. Snuke's Subway Trip

    すぬけ君の地下鉄旅行 / Snuke's Subway Trip Time limit : 3sec / Memory limit : 256MB Score : 600 points Problem ...

  4. 2018.09.19 atcoder Snuke's Subway Trip(最短路)

    传送门 就是一个另类最短路啊. 利用颜色判断当前节点的最小花费的前驱边中有没有跟当前的边颜色相同的. 如果有这条边费用为0,否则费用为1. 这样跑出来就能ac了. 代码: #include<bi ...

  5. [ARC061E]すぬけ君の地下鉄旅行 / Snuke's Subway Trip

    题目大意:Snuke的城镇有地铁行驶,地铁线路图包括$N$个站点和$M$个地铁线.站点被从$1$到$N$的整数所标记,每条线路被一个公司所拥有,并且每个公司用彼此不同的整数来表示. 第$i$条线路($ ...

  6. ARC061E Snuke's Subway Trip

    传送门 题目大意 已知某城市的地铁网由一些地铁线路构成,每一条地铁线路由某一个公司运营,该城市规定:若乘坐同一公司的地铁,从开始到换乘只需要一块钱,换乘其他公司的价格也是一块钱,问从1号地铁站到n号地 ...

  7. atcoder C - Snuke and Spells(模拟+思维)

    题目链接:http://agc017.contest.atcoder.jp/tasks/agc017_c 题解:就是简单的模拟一下就行.看一下代码就能理解 #include <iostream& ...

  8. AtCoder AGC017C Snuke and Spells

    题目链接 https://atcoder.jp/contests/agc017/tasks/agc017_c 题解 很久前不会做看了题解,现在又看了一下,只想说,这种智商题真的杀我... 转化成如果现 ...

  9. AtCoder 杂题训练

    前言: 因为要普及了,今年没一等就可以退役去学文化课了,所以暑假把历年noip普及组都刷了一遍,离noip还有50+天,想弄点强化训练什么的. 想了想,就这些天学文化课之余有空就把AtCoder之前那 ...

随机推荐

  1. python爬虫之爬虫性能篇

    一.首先想到的是for循环,单线程爬取每个url,但是如果有url出现了问题,后面的url就得等,性能低. 二.我们考虑线程池的问题,下面我们定义了线程池里面最多10个任务,也就是说最多同一时间只能有 ...

  2. Postman & API

    Postman & API https://www.getpostman.com/ https://www.getpostman.com/downloads/ Postman Canary h ...

  3. 魔术方法:__set、__get

    __set: 在设置对象里边不能直接设置(或没有)的属性值的时候,自动去被调用 class Track { private $track_name; public function __set($na ...

  4. JVM是如何处理异常的

    JVM处理异常 异常处理的两大组成要素是抛出异常和捕获异常.这两大要素共同实现程序控制流的非正常转移. 抛出异常可分为显式和隐式两种.显式抛异常的主体是应用程序,指的是在程序中使用throw关键字,手 ...

  5. VMware ezmomi工具使用

    用两个静态IP克隆模板: ezmomi clone --template centos67 --hostname test01 --cpus 2 --mem 4 --ips 172.10.16.203 ...

  6. springMVC (优秀篇)

    本文依然是复制的 Spring3 MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也很优秀. 官方的下载网址是:http://www.springsource.org/download  ...

  7. BZOJ2565最长双回文串——manacher

    题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两 ...

  8. BZOJ1208[HNOI2004]宠物收养场——treap

    凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领 ...

  9. 洛谷P1781宇宙总统题解

    题目 此题原本是一个简单的排序,但因为数据范围的限制,所以变成了一个需采用字符串排序的题目,接下来我将给大家讲一下如何字符串排序. 首先先判断为位数上是否相同,如果不同再比较那一位的数就可以了 #in ...

  10. X问题 HDU - 1573(excrt入门题)

    X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...