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

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

第$i$条线路($1\le i \le M$)是直接连接$p_i$与$q_i$的双向铁路,中间不存在其他站点,且这条铁路由$c_i$公司所拥有。

如果乘客只乘坐同一公司的铁路,他只需要花费一元,但如果更换其他公司的铁路需要再花一元。当然,如果你要再换回原来的公司,你还是要花一元。

Snuke在1号站的位置出发,他想通过地铁去第$N$站,请求出最小钱数。如果无法到达第$N$站,输出-1。

最短路建图的好题
首先我们知道,在同一个颜色的联通块内只要一块钱就可以随意走动
那么我们就在这个联通块的入口处连一条长度为1的边,中间连长度为0的边
用map存每个颜色的入口联通块的编号,可知最多有M*2种编号
跑一遍最短路即可,注意答案要除以2(入口和出口都经过了一遍)
代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<map>
 6 #define M 1000010
 7 using namespace std;
 8 int read()
 9 {
10     char ch=getchar();int x=0;
11     while(ch>‘9‘||ch<‘0‘) ch=getchar();
12     while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
13     return x;
14 }
15 struct point{
16     int to,next,dis;
17 }e[M<<1];
18 int n,m,num,cnt;
19 int head[M],dis[M];bool vis[M];
20 void add(int from,int to,int dis)
21 {
22     e[++num].next=head[from];
23     e[num].to=to;
24     e[num].dis=dis;
25     head[from]=num;
26 }
27 void SPFA()
28 {
29     memset(dis,127,sizeof(dis));
30     queue<int>q;
31     q.push(1);
32     vis[1]=true;
33     dis[1]=0;
34     while(!q.empty())
35     {
36         int x=q.front(); q.pop();
37         for(int i=head[x];i;i=e[i].next)
38         {
39             int to=e[i].to;
40             if(dis[to]>dis[x]+e[i].dis)
41             {
42                 dis[to]=dis[x]+e[i].dis;
43                 if(!vis[to])
44                 {
45                     vis[to]=true;
46                     q.push(to);
47                 }
48             }
49         }
50         vis[x]=false;
51     }
52 }
53 map<pair<int,int>,int>P;
54 int get(int x,int y)
55 {
56     if(P.find(make_pair(x,y))!=P.end()) return P[make_pair(x,y)];
57     else return P[make_pair(x,y)]=++cnt;
58 }
59 int main()
60 {
61     n=cnt=read(); m=read();
62     for(int i=1;i<=m;i++)
63     {
64         int a=read(),b=read(),c=read();
65         int id1=get(a,c),id2=get(b,c);
66         add(id1,id2,0); add(id2,id1,0);
67         add(a,id1,1); add(id1,a,1);
68         add(b,id2,1); add(id2,b,1);
69     }
70     SPFA();
71     printf("%d\n",dis[n]>2*n?-1:dis[n]/2);
72     return 0;
73 }

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

原文地址:https://www.cnblogs.com/Slrslr/p/9692607.html

时间: 2024-10-09 16:29:57

[ARC061E]すぬけ君の地下鉄旅行 / Snuke's Subway Trip的相关文章

AtCoder ARC061E Snuke&#39;s Subway Trip 最短路

目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门 ?Portal ?原题目描述在最下面. ?\(n(1e5)\)个点, \(m(2e5)\)条边, 每条边有一个属性值.经过一条同一属性值的连续路径花费为1.问从1到n的最小花费. Solution: 我的解法 ?直接边最短路搞,然后t的飞起.仔细一想,这样写的话有\(1e5\)个点,边数更是多到飞起,拿命跑啊,不过代码我还是放下面. 正解:拆点 ?把一条\(u

Atcoder Snuke&#39;s Subway Trip 重构图

题目链接 这题主要是重构图的方法很难思考. 方法一:考虑在每个公司意义下的联通块,每个联通块对应一个虚拟节点,联通块内的节点到联通块对应的虚拟节点有一条边,构建出一个二分图,跑一遍BFS,将经过的边数除以2.这里有两种实现,                             细节都注释在了程序里 1 #include<bits/stdc++.h> 2 using namespace std; 3 vector<pair<int,int> > nei[1000005

【例题收藏】◇例题&#183;I◇ Snuke&#39;s Subway Trip

◇例题·I◇ Snuke's Subway Trip 题目来源:Atcoder Regular 061 E题(beta版) +传送门+ 一.解析 (1)最短路实现 由于在同一家公司的铁路上移动是不花费的,只有在换乘时会花费1日元.我们可以视换乘的花费为点权--当换乘到不同公司时花费1,同一家公司时花费0. 对于这种点权因情况而变化的题,最常见的做法便是拆点.设节点 u 相连的铁路由 c1,c2,...,cp p个公司修建,则将节点u拆分为节点 uc1~ucp,点uci表示到达点u的铁路是由公司c

csp退役前的做题计划1(真)

csp退役前的做题计划1(真) 因为我太菜了,所以在第一次月考就会退役,还是记录一下每天做了什么题目吧. 任务计划 [ ] Z算法(Z Algorithm) 9.28 [x] ARC061C たくさんの数式 / Many Formulas [x] ARC061D すぬけ君の塗り絵 / Snuke's Coloring [x] ARC061E すぬけ君の地下鉄旅行 / Snuke's Subway Trip [x] ARC061F 3人でカードゲーム / Card Game for Three [

日常交通工具日语词汇

各種汽车 gèzh?ngqìchê じどうしゃ[自動車] jidousha vehicle/car ロット 游览车 yóul?nchê かんこうバス[観光バス] kankoubasu sight seeing bus ロットトゥア 公共汽车 g?nggòngqìchê ろせんバス[路線バス] rosenbasu route bus ロットメー 双層公共汽车 shuangcéng g.g.q.c. にかいだてバス[二階建バス] nikaidatebasu double-decker  小巴 xi?

新标日初级:04(房间里有桌子和椅子)

一.语法部分 1.部屋(へや)に 机と いすが あります. 2.机の 上(うえ)に 猫(ねこ)が います. 3.売店(ばいてん) は 駅(えき)の 外(そと)に あります. 4.吉田さんは 庭(にわ)に います. 二.基本课文 A 甲:その 箱の 中(なか)に 何が ありますか. 乙:時計と 眼鏡(めがね)が あります. B 甲:部屋に 誰(だれ)が いますか. 乙:誰も いません. C 甲:小野さんの家は どこに ありますか. 乙:横浜(よこはま)に あります. D 甲:あそこに 犬(いぬ)が

2015-11-18 单词记录

ぃる ご兄弟(きょうだい)はいますか いるよ ある 机(つくえ)の上(うえ)に本があります 居間(いま) 居間は.家(いえ)の中(なか)で家族(かぞく)が集まる(あつまる)場所(ばしょ)です き 公園(こうえん)に桜(さくら)の木があります 一人暮らし(ひとりぐらし) 山田(やまた)さんは一人暮らしです 地下鉄(ちかてつ) この近く(ちかく)に地下鉄の駅(えき)があります 売店(ばいてん) 学校(がっこう)の中に売店があります 花屋(はなや) 病院(びょういん)の近くに花屋があります 図書室(と

日语二级能力考试听力常见词汇

图表,图标相关的词汇 时间变化: 推移(すいい).変動(へんどう).変化(へんか).移り変わり(うつりかわり)ー变化,演变: 变化倾向: 動き(うごき).動向(どうこう).傾向(けいこう).向上(こうじょう)ー向上,提高: 变化程度: 平均(へいきん).標準(ひょうじゅん).ピーク.頂点(ちょうてん).水準(すいじゅん).レベル.目立つ(めだつ)ー显眼,引人注目: 变化形式: 増減(ぞうげん).上昇(じょうしょう)ー上升,上涨.増える(ふえる).伸びる(のびる)ー伸长,变长.上がる(あがる).上

【1801視聴説2宿題】中国のリサイクル事情やごみの分別事情に対する意見

 中国のリサイクル事情やごみの分別事情とそれに対する意見 添削しています.自分が書いた文章と見比べて修正箇所を確認してください. 私は中国で暮らすようになって.ゴミの分別がないのですごく楽だと感じています.日本でも韓国でも燃えるゴミ.燃えないゴミ.パットボトル.缶.瓶.段ボールなどの紙類は分別していました.電池や金属類なども別でした.それが中国ではすべてひとつのゴミ箱にいつでも捨てられるのです.しかし.あのゴミは一体どうなるのか不安になることもあります.ゴミの分別は面倒くさいですが.自然環境を守