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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【2018.3.10】模拟赛之四-ssl2133 腾讯大战360【SPAF,图论,最短路径】

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【2018.3.10】模拟赛之四-ssl2133 腾讯大战360【SPAF,图论,最短路径】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄地址

前言

打錯了一個地方之接60,還有輸出“Peace”能拿60。還有題目坑爹害得我用了哈希,可以無視 QAQ


正題

有一個n*n的圖,有m條邊,不知道幾個城市,給出兩個位置,求兩個位置移動到相遇(不能再路上)的最短路徑。


輸入輸出(需要自取)

Input

輸入數據第一行:N和M(用空格隔開) 表示這是一個N*N的圖并且有M條邊,第二行到第M+1行 為這個圖的詳細信息。
每行共有被空格隔開的三個數:a b c。表示編號為a的城市到編號為b的城市
有一個雙向邊,并且要過這條雙向邊所需要花費的時間為c。
最后一行有兩個數:S和T,S表示騰訊所處的城市(也就是深圳),T表示360所處的
城市(也就是北京)

Output

輸出只有一行,D,表示二者“相遇”的最短時間。當然,如果無法相遇則輸出“Peace!”

Sample Input

3 3
1 2 1
2 3 1
1 3 1
1 3

Sample Output

1


解題思路

兩遍SPFA,然后枚舉相遇點。無視哈希


代碼

#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int p=29989,air=-117901064; struct woc{int x,y,w,next; }; int n,m,sum,f[p+1],ls[p+1],f2[p+1],hash[p+1],state[p+1],head,tail,num; bool v[p+1]; woc line[10001]; int hashmath(int x) {return abs(x)%p; } int locate(int x) {int wz=hashmath(x);int i=0;while (i<p && hash[(wz+i)%p]!=x && hash[(wz+i)%p]!=air)i++;return (wz+i)%p; } void Spfa(int x)//SPFA不解釋 {memset(f,127/3,sizeof(f));state[1]=locate(x);v[state[1]]=true;f[state[1]]=0;int w=0;head=0;tail=1;do{head=head%p+1;w=ls[state[head]];while (w!=0){if (f[line[w].x]+line[w].w<f[line[w].y]){f[line[w].y]=f[line[w].x]+line[w].w;if (!v[line[w].y]){v[line[w].y]=true;tail=tail%p+1;state[tail]=line[w].y;}}w=line[w].next;}v[state[head]]=false;}while (head!=tail); } void Spfa2(int x) {memset(f2,127/3,sizeof(f2));state[1]=locate(x);v[state[1]]=true;f2[state[1]]=0;int w=0;head=0;tail=1;do{head=head%p+1;w=ls[state[head]];while (w!=0){if (f2[line[w].x]+line[w].w<f2[line[w].y]){f2[line[w].y]=f2[line[w].x]+line[w].w;if (!v[line[w].y]){v[line[w].y]=true;tail=tail%p+1;state[tail]=line[w].y;}}w=line[w].next;}v[state[head]]=false;}while (head!=tail); } int main() {scanf("%d%d",&n,&m);for (int i=0;i<p;i++) hash[i]=air;int xx,yy,ww,wz1,wz2;for (int i=1;i<=m;i++){scanf("%d%d%d",&xx,&yy,&ww);wz1=locate(xx);wz2=locate(yy);if (hash[wz1]==air) hash[wz1]=xx;if (hash[wz2]==air) hash[wz2]=yy;line[++num].x=wz1;line[num].y=wz2;line[num].w=ww;line[num].next=ls[wz1];ls[wz1]=num;line[++num].x=wz2;line[num].y=wz1;line[num].w=ww;line[num].next=ls[wz2];ls[wz2]=num;//無向圖建鄰接表}scanf("%d%d",&xx,&yy);Spfa(xx);Spfa2(yy);//兩遍SPFAsum=-air;for (int i=0;i<p;i++)//枚舉相遇點{if (hash[i]!=air){sum=min(sum,max(f[i],f2[i]));//更新最大值}}if (sum==-air) printf("Peace!");//判斷無法相遇else printf("%d",sum);return 0; }

總結

以上是生活随笔為你收集整理的【2018.3.10】模拟赛之四-ssl2133 腾讯大战360【SPAF,图论,最短路径】的全部內容,希望文章能夠幫你解決所遇到的問題。

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