腾讯大战360
騰訊大戰(zhàn)360
題目
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數(shù)據(jù)范圍
每組都是n=5000 m=5000。
保證運(yùn)算過(guò)程中的所有值都不會(huì)超過(guò)117901063。
思路
這道題呢,可以用兩個(gè)地方都做一次SPFA,求出他們兩個(gè)到每個(gè)城市的最短時(shí)間。
然后枚舉每個(gè)城市,求出在每個(gè)城市相遇所需的最短時(shí)間。
最后再把這些最短時(shí)間再求一次其中的最短時(shí)間,那個(gè),就是答案了。
代碼
#include<cstdio> #include<iostream> #include<cmath> #include<queue> #include<cstring> using namespace std; struct note//定義結(jié)構(gòu)體 {int x,next; }e[10001]; int n,m,ls[5001],x[5001],y[5001],s,t,k,a[5001][5001],an[5001],an1[5001],minn; bool in[5001]; 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];//因?yàn)槭菬o(wú)向圖,所以來(lái)往兩邊都要賦長(zhǎng)度e[++k]=(note){s,ls[t]};ls[t]=k;//建鄰接表e[++k]=(note){t,ls[s]};ls[s]=k;}scanf("%d%d",&s,&t);//讀入memset(an,117901064,sizeof(an));queue<int>l;//建隊(duì)列(SPFA)(以s為出發(fā)點(diǎn))an[s]=0;l.push(s);while (!l.empty()){int hh=l.front();l.pop();for (int i=ls[hh];i;i=e[i].next)if (an[e[i].x]>an[hh]+a[hh][e[i].x]){an[e[i].x]=an[hh]+a[hh][e[i].x];if (!in[e[i].x]){l.push(e[i].x);in[e[i].x]=1;}}in[hh]=0;}int temp=s;s=t;t=temp;//再次SPFA(以t為出發(fā)點(diǎn))memset(an1,117901064,sizeof(an));an1[s]=0;l.push(s);while (!l.empty()){int hh=l.front();l.pop();for (int i=ls[hh];i;i=e[i].next)if (an1[e[i].x]>an1[hh]+a[hh][e[i].x]){an1[e[i].x]=an1[hh]+a[hh][e[i].x];if (!in[e[i].x]){l.push(e[i].x);in[e[i].x]=1;}}in[hh]=0;}minn=117901064;//求相遇最短時(shí)間for (int i=1;i<=n;i++)if (i!=s&&i!=t) minn=min(minn,max(an[i],an1[i]));else if (i==s) minn=min(minn,an[i]);else minn=min(minn,an1[i]);if (minn!=117901064) printf("%d",minn);else printf("Peace!");return 0; }總結(jié)
- 上一篇: future cancel失败一例
- 下一篇: 静态路由与动态路由协议OSPF、RIP简