【图论】腾讯大战360
題目描述
2010年11月3日,是一個(gè)難忘的日子。 騰訊發(fā)布消息:存360則,不留QQ。留QQ,則須卸360。 360則表示360與QQ可以共存。 這也就標(biāo)志著騰訊與360的大戰(zhàn)就此開始!
現(xiàn)在,騰訊與360由于身處異地,非常迫切地想在最短的時(shí)間內(nèi)相遇,然后干一架。但是由于雙方的技術(shù)員都在努力地編程序想干掉對方,所以他們希望你來幫他們找到一個(gè)最好的方案使得相遇的時(shí)間最短。
在此我們定義“相遇”為:兩個(gè)人皆在同一個(gè)有編號(hào)的城市上就可以了,并且這兩個(gè)人均可以站在原地等另外一個(gè)人。也就是說,在這里我們不考慮兩人在路中間相遇。
輸入
輸入數(shù)據(jù)第一行:N和M(用空格隔開) 表示這是一個(gè)N*N的圖并且有M條邊,第二行到第M+1行 為這個(gè)圖的詳細(xì)信息。
每行共有被空格隔開的三個(gè)數(shù):a b c。表示編號(hào)為a的城市到編號(hào)為b的城市
有一個(gè)雙向邊,并且要過這條雙向邊所需要花費(fèi)的時(shí)間為c。
最后一行有兩個(gè)數(shù):S和T,S表示騰訊所處的城市(也就是深圳),T表示360所處的
城市(也就是北京)
輸出
輸出只有一行,D,表示二者“相遇”的最短時(shí)間。當(dāng)然,如果無法相遇則輸出“Peace!”
輸入樣例
3 3 1 2 1 2 3 1 1 3 1 1 3輸出樣例
1說明
[數(shù)據(jù)范圍]每組都是n=5000 m=5000 并且保證運(yùn)算過程中的所有值都不會(huì)超過117901063
思路
兩次SPFA,分別表示TX所在的城市到達(dá)其他城市的最短路,360所在的城市到達(dá)其他城市的最短路;然后forforfor所有可能相遇的點(diǎn)
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; struct whw {int w,h,t; }wh[100005]; int dis[100005][2],h[100005]; int n,m,x,y,z,t,minn=1e9; bool b[100005]; void SPFA(int k,int tot)//SPFA {memset(b,0,sizeof(b));dis[k][tot]=0;queue<int>w;w.push(k);while(!w.empty()){int tt=w.front();w.pop();for(int i=h[tt];i;i=wh[i].h){if(dis[wh[i].w][tot]>dis[tt][tot]+wh[i].t){dis[wh[i].w][tot]=dis[tt][tot]+wh[i].t;if(!b[wh[i].w]){w.push(wh[i].w);b[wh[i].w]=1;}}}b[tt]=0;} } int main() {scanf("%d%d",&n,&m);for(int i=1;i<=m;++i){scanf("%d%d%d",&x,&y,&z);wh[++t]=(whw){y,h[x],z};h[x]=t;wh[++t]=(whw){x,h[y],z};h[y]=t;}memset(dis,0x7f,sizeof(dis));scanf("%d%d",&x,&y);SPFA(x,0);SPFA(y,1);for(int i=1;i<=n;++i)//枚舉每一個(gè)點(diǎn)minn=min(minn,max(dis[i][0],dis[i][1]));if(minn==1e9)printf("Peace!");else printf("%d",minn);return 0; }總結(jié)
以上是生活随笔為你收集整理的【图论】腾讯大战360的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 量化交易领域最重要的10本参考书推荐
- 下一篇: 如果光猫+hadoop,有化学反应吗?