8.12 腾讯大战360 2133
- 題目
- 題解
- 代碼
題目
2010年11月3日,是一個(gè)難忘的日子。 騰訊發(fā)布消息:存360則,不留QQ。留QQ,則須卸360。 360則表示360與QQ可以共存。 這也就標(biāo)志著騰訊與360的大戰(zhàn)就此開始!
現(xiàn)在,騰訊與360由于身處異地,非常迫切地想在最短的時(shí)間內(nèi)相遇,然后干一架。但是由于雙方的技術(shù)員都在努力地編程序想干掉對(duì)方,所以他們希望你來幫他們找到一個(gè)最好的方案使得相遇的時(shí)間最短。
在此我們定義“相遇”為:兩個(gè)人皆在同一個(gè)有編號(hào)的城市上就可以了,并且這兩個(gè)人均可以站在原地等另外一個(gè)人。也就是說,在這里我們不考慮兩人在路中間相遇。
[數(shù)據(jù)范圍]每組都是n=5000 m=5000 并且保證運(yùn)算過程中的所有值都不會(huì)超過117901063
輸出只有一行,D,表示二者“相遇”的最短時(shí)間。當(dāng)然,如果無法相遇則輸出“Peace!”
題解
一道很水很水的,SPFA
嗯,真的很水
至于為什么早上沒過,純屬傻了————
明明只用做一遍的東西,為什么做了n遍?是嫌時(shí)間太多么?(并沒有,是忘記了只用做一遍)
QAQ,我的分啊!Orz。。。。。
現(xiàn)在才是題解
因?yàn)樾枰寖扇讼嘤鲈谝粋€(gè)點(diǎn)上,所以可以做一遍從騰訊所在城市的SPFA,然后做一遍從360開始的SPFA,接著枚舉n個(gè)點(diǎn),找最小的max(d[i],dz[i]),即為答案
因?yàn)槭莾蓚€(gè)人,所以時(shí)間應(yīng)取兩人到達(dá)當(dāng)前點(diǎn)最短路中的最大值
時(shí)間復(fù)雜度O(n+m)
代碼
typearr=array[0..100000]of longint; varn,m,i,j,k,s,t,ans:longint;x,y,w,v,ls,ne,d,dz:arr;b:array[0..10000]of boolean;function max(a,b:longint):longint; beginif a>b then exit(a) else exit(b); end;procedure spfa(var d:arr;s:longint); vari,j,k,h,tail:longint; beginfillchar(b,sizeof(b),true);h:=0;tail:=1;v[1]:=s;d[s]:=0;b[s]:=false;while h<tail dobegininc(h);k:=ls[v[h]];while k>0 dobeginif d[v[h]]+w[k]<d[y[k]] thenbegind[y[k]]:=d[v[h]]+w[k];if b[y[k]] thenbegininc(tail);b[y[k]]:=false;v[tail]:=y[k];end;end;k:=ne[k];end;b[v[h]]:=true;end; end;beginreadln(n,m);for i:=1 to m dobegininc(j);readln(x[j],y[j],w[j]);ne[j]:=ls[x[j]];ls[x[j]]:=j;inc(j);x[j]:=y[j-1];y[j]:=x[j-1];w[j]:=w[j-1];ne[j]:=ls[x[j]];ls[x[j]]:=j;end;ans:=maxlongint;readln(s,t);fillchar(d,sizeof(d),$7f);spfa(d,s);fillchar(dz,sizeof(dz),$7f);spfa(dz,t);for i:=1 to n dobeginj:=max(d[i],dz[i]);if j<ans then ans:=j;end;if ans<>d[0] then writeln(ans) else writeln('Peace!'); end.總結(jié)
以上是生活随笔為你收集整理的8.12 腾讯大战360 2133的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吉他谱——北方的狼
- 下一篇: 谷歌安装ElasticSearch-he