日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

すぬけ君の地下鉄旅行 / Snuke's Subway Trip(AtCoder-2069)

發布時間:2025/3/17 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 すぬけ君の地下鉄旅行 / Snuke's Subway Trip(AtCoder-2069) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Problem Description

Snuke's town has a subway system, consisting of?N?stations and?M?railway lines. The stations are numbered?1?through?N. Each line is operated by a company. Each company has an identification number.

The?i-th (?1≤i≤M?) line connects station?pi?and?qi?bidirectionally. There is no intermediate station. This line is operated by company?ci.

You can change trains at a station where multiple lines are available.

The fare system used in this subway system is a bit strange. When a passenger only uses lines that are operated by the same company, the fare is?1?yen (the currency of Japan). Whenever a passenger changes to a line that is operated by a different company from the current line, the passenger is charged an additional fare of?1?yen. In a case where a passenger who changed from some company A's line to another company's line changes to company A's line again, the additional fare is incurred again.

Snuke is now at station?1?and wants to travel to station?N?by subway. Find the minimum required fare.

Constraints

  • 2≤N≤105
  • 0≤M≤2×105
  • 1≤pi≤N?(1≤i≤M)
  • 1≤qi≤N?(1≤i≤M)
  • 1≤ci≤106?(1≤i≤M)
  • pi≠qi?(1≤i≤M)

Input

The input is given from Standard Input in the following format:

N M
p1 q1 c1
:
pM qM cM

Output

Print the minimum required fare. If it is impossible to get to station N by subway, print -1 instead.

Example

Sample Input 1

3 3
1 2 1
2 3 1
3 1 2

Sample Output 1

1
Use company 1's lines: 1 → 2 → 3. The fare is 1 yen.

Sample Input 2

8 11
1 3 1
1 4 2
2 3 1
2 5 1
3 4 3
3 6 3
3 7 3
4 8 4
5 6 1
6 7 5
7 8 5

Sample Output 2

2
First, use company 1's lines: 1 → 3 → 2 → 5 → 6. Then, use company 5's lines: 6 → 7 → 8. The fare is 2 yen.

Sample Input 3

2 0

Sample Output 3

-1

題意:n 個點 m 條邊,每條邊給出鄰接點的同時給出一個價值,代表的是該邊所屬的公司,現在要從 1 號點到 n 號點,已知在同一個公司上行走時,無需付出任何代價,但當走到令一公司的邊上時,需要花費 1 元,求最小花費

思路:

這個題的問題在于讓相同公司的道路之間行走花費為 0,不同公司之間的道路行走花費為 1,于是整張圖的每個公司可以看做一個虛點,其連接著其所屬的邊的兩點

由于在同一個公司的路上行走時,不耗費任何價值,那么可以對同一公司的路上進行拆點建圖,即對于所屬公司為 val 的邊 x-y,將其拆成 x-newX、newX-newY、newY-y 三條邊,其價值分別為 1、0、1,然后對整個圖跑 SPFA 求最短路即可

跑完 SPFA 時,由于在起點時需要一個初始代價,中間行走時不需要代價,離開時也需要一個代價,因此 dis[n]/2 就是答案

此外,重點在于如何拆點能保證點不重復,考慮到 map 的特性,我們令 mp[a][b] 的值從 n 號點開始遞增,從而保證點的唯一性

需要注意的是,由于拆完點后點和邊的數目會很多,因此數組范圍要開的大一點

Source Program

#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #define EPS 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f #define LL long long const int MOD = 1E9+7; const int N = 1000000+5; const int dx[] = {0,0,-1,1,-1,-1,1,1}; const int dy[] = {-1,1,0,0,-1,1,-1,1}; using namespace std; struct Edge {int to,next,val;Edge(){}Edge(int to,int next,int val):to(to),next(next),val(val){}bool operator < (const Edge& rhs)const{return val>rhs.val;} }edge[N*2]; int tot,head[N]; void addEdge(int from,int to,int val) {edge[tot].next=head[from];edge[tot].to=to;edge[tot].val=val;head[from]=tot++; } bool vis[N]; int dis[N]; int SPFA(int s,int e) {memset(vis,false,sizeof(vis));memset(dis,INF,sizeof(dis));dis[s]=0;priority_queue<Edge> Q;Q.push(Edge(s,0,0));while (!Q.empty()) {Edge temp=Q.top();Q.pop();if(vis[temp.to])continue;vis[temp.to]=true;for(int i=head[temp.to]; i!=-1; i=edge[i].next) {if(dis[edge[i].to]>dis[temp.to]+edge[i].val) {dis[edge[i].to]=dis[temp.to]+edge[i].val;Q.push(Edge(edge[i].to,0,dis[edge[i].to]));}}}if(dis[e]!=INF)return dis[e]/2;return -1; } map<int,int> mp[N]; int allPoint; int getPoint(int x,int y) {if (!mp[x][y])mp[x][y]=++allPoint;return mp[x][y]; } int main() {int n,m;scanf("%d%d",&n,&m);memset(head,-1,sizeof(head));allPoint=n;for (int i=1; i<=m; i++) {int x,y,w;scanf("%d%d%d",&x,&y,&w);int newX=getPoint(x,w);int newY=getPoint(y,w);addEdge(x,newX,1);addEdge(newX,x,1);addEdge(newX,newY,0);addEdge(newY,newX,0);addEdge(y,newY,1);addEdge(newY,y,1);}int res=SPFA(1,n);printf("%d\n",res);return 0; }

?

總結

以上是生活随笔為你收集整理的すぬけ君の地下鉄旅行 / Snuke's Subway Trip(AtCoder-2069)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一起草最新网址 | 午夜羞羞羞 | 自拍偷拍校园春色 | 四季av日韩精品一区 | 韩国中文字幕在线观看 | 91成人在线观看喷潮 | 在线观看成人网 | 二区三区在线视频 | 一区二区三区视频免费观看 | 日韩一级二级视频 | 国产又粗又大又黄 | 99国产超薄肉色丝袜交足 | eeuss一区| 性高跟鞋xxxxhd人妖 | www激情com | 国产伦理一区二区三区 | 香蕉网av| 91美女诱惑| 91福利视频在线观看 | 99人妻少妇精品视频一区 | 中文字幕一区二区三区精华液 | 自慰无码一区二区三区 | 狠狠干影院 | 成人av国产| 爱爱综合 | 日韩大片免费看 | 免费观看亚洲视频 | 午夜高潮视频 | 久久久久久久久久99 | 99久久香蕉 | 秋霞精品 | 无码人妻久久一区二区三区不卡 | 玖草在线观看 | 日本韩国欧美中文字幕 | 黄色香蕉软件 | www.av777| jizz俄罗斯 | 黄色短视频在线播放 | 国产九色视频 | 成年人视频在线免费观看 | 在线观看日韩中文字幕 | 天码人妻一区二区三区在线看 | 久久久久人妻一区精品色 | 欧美激情综合色综合啪啪五月 | 亚洲黄色一区二区三区 | 一区国产精品 | 国产成年视频 | 国产女人18毛片水真多1 | 8x国产一区二区三区精品推荐 | xxx久久| 亚洲精品成人片在线观看精品字幕 | 国产又粗又猛又爽又黄的视频一 | 日韩一区二区三区在线看 | 原创真实夫妻啪啪av | jizzjizz8| 亚州黄色网址 | 成人免费a级片 | 日韩激情小说 | 国产一区二区在 | 鲁丝av | 福利视频亚洲 | 欧美日日 | 少妇一区二区三区四区 | 啪视频网站 | eeuss鲁片一区二区三区在线观看 | 麻豆网页| 欧美精品在线免费观看 | 亚洲欧美在线播放 | 亚洲人成小说 | 在线观看中文字幕一区二区 | 99插插插 | 中文字幕视频观看 | 亚洲三级影院 | 中文一区视频 | 午夜精彩视频 | 欧美日韩不卡一区 | 你懂的在线网站 | 久久东京 | 激情无码人妻又粗又大 | 欧美亚洲网站 | 爱豆国产剧免费观看大全剧集 | 国产h片在线观看 | 少妇无码一区二区三区 | 日韩av在线天堂 | 欧美日韩一区免费 | 欧洲成人一区二区三区 | 人妻丰满熟妇av无码区hd | 蜜臀av夜夜澡人人爽人人 | 天天爽夜夜爽一区二区三区 | 亚洲色图在线播放 | 成人羞羞国产免费动态 | 免费在线毛片 | 日日躁夜夜躁白天躁晚上躁91 | 欧美色xxx| 国产成人无码一区二区在线观看 | 久久亚洲私人国产精品va | 亚洲黄a | 在线精品自拍 | 卡一卡二在线视频 |