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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【SPFA】【最短路】 腾讯大战360

發(fā)布時(shí)間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【SPFA】【最短路】 腾讯大战360 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目:

2010年11月3日,是一個(gè)難忘的日子。 騰訊發(fā)布消息:存360則,不留QQ。留QQ,則須卸360。 360則表示360與QQ可以共存。 這也就標(biāo)志著騰訊與360的大戰(zhàn)就此開(kāi)始!
現(xiàn)在,騰訊與360由于身處異地,非常迫切地想在最短的時(shí)間內(nèi)相遇,然后干一架。但是由于雙方的技術(shù)員都在努力地編程序想干掉對(duì)方,所以他們希望你來(lái)幫他們找到一個(gè)最好的方案使得相遇的時(shí)間最短。
在此我們定義“相遇”為:兩個(gè)人皆在同一個(gè)有編號(hào)的城市上就可以了,并且這兩個(gè)人均可以站在原地等另外一個(gè)人。也就是說(shuō),在這里我們不考慮兩人在路中間相遇。


輸入:

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


輸出:

輸出只有一行,D,表示二者“相遇”的最短時(shí)間。當(dāng)然,如果無(wú)法相遇則輸出“Peace!”


樣例輸入:

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

樣例輸出:

1

思路:

跑兩遍spfa求出360 or 騰訊 到每個(gè)城市的最短路徑,然后把這些最短路徑去個(gè)min值,這個(gè)值就是答案,如果到不了就可以輸出Peace!

題外話:我們學(xué)校的lj數(shù)據(jù),輸出Peace!可以拿60分。。。。。


代碼:

#include<cstdio> #include<iostream> #include<queue> using namespace std; int n,m,s,t,a[5001][5001],h[5001],tt,ojbk[5001],dis1[5001],dis2[5001],minn; bool le[5001]; struct node {int w,p; }e[10001]; int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d%d",&s,&t);scanf("%d",&a[s][t]);a[t][s]=a[s][t];e[++tt]=(node){s,ojbk[t]} ;ojbk[t]=tt;//鄰接表e[++tt]=(node){t,ojbk[s]} ;ojbk[s]=tt; }scanf("%d%d",&s,&t);memset(dis1,127/3,sizeof(dis1));le[s]=1;dis1[s]=0;queue<int>z;z.push(s);while (!z.empty())//第一遍SPFA{int sum=z.front();z.pop();for (int i=ojbk[sum];i;i=e[i].p)if (dis1[e[i].w]>dis1[sum]+a[sum][e[i].w]){dis1[e[i].w]=dis1[sum]+a[sum][e[i].w];if (!le[e[i].w]){z.push(e[i].w);le[e[i].w]=1;}}le[sum]=0;} int bottle=s,s=t,t=bottle;memset(dis2,127/3,sizeof(dis2));dis2[s]=0;le[s]=1;z.push(s);while (!z.empty())//第二遍SPFA{int sum=z.front();z.pop();for (int i=ojbk[sum];i;i=e[i].p)if (dis2[e[i].w]>dis2[sum]+a[sum][e[i].w]){dis2[e[i].w]=dis2[sum]+a[sum][e[i].w];if (!le[e[i].w]){z.push(e[i].w);le[e[i].w]=1;}}le[sum]=0;} minn=117901064;//求答案for(int i=1;i<=n;i++)if (i!=s&&i!=t) minn=min(minn,max(dis1[i],dis2[i]));else if (i==s) minn=min(minn,dis1[i]);else minn=min(minn,dis2[i]);if (minn!=117901064) printf("%d",minn);else printf("Peace!");return 0; }

總結(jié)

以上是生活随笔為你收集整理的【SPFA】【最短路】 腾讯大战360的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。