生活随笔
收集整理的這篇文章主要介紹了
【SPFA】腾讯大战360
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目描述
2010年11月3日,是一個難忘的日子。 騰訊發(fā)布消息:存360則,不留QQ。留QQ,則須卸360。 360則表示360與QQ可以共存。 這也就標志著騰訊與360的大戰(zhàn)就此開始!
現(xiàn)在,騰訊與360由于身處異地,非常迫切地想在最短的時間內(nèi)相遇,然后干一架。但是由于雙方的技術(shù)員都在努力地編程序想干掉對方,所以他們希望你來幫他們找到一個最好的方案使得相遇的時間最短。
在此我們定義“相遇”為:兩個人皆在同一個有編號的城市上就可以了,并且這兩個人均可以站在原地等另外一個人。也就是說,在這里我們不考慮兩人在路中間相遇。
輸入
輸入數(shù)據(jù)第一行:N和M(用空格隔開) 表示這是一個N*N的圖并且有M條邊,第二行到第M+1行 為這個圖的詳細信息。
每行共有被空格隔開的三個數(shù):a b c。表示編號為a的城市到編號為b的城市
有一個雙向邊,并且要過這條雙向邊所需要花費的時間為c。
最后一行有兩個數(shù):S和T,S表示騰訊所處的城市(也就是深圳),T表示360所處的
城市(也就是北京)
輸出
輸出只有一行,D,表示二者“相遇”的最短時間。當(dāng)然,如果無法相遇則輸出“Peace!”
思路
騰訊360雙重SPFA(它們分別作起點),然后枚舉任意一個點讓騰訊與360相遇。時間取騰訊和360到達的時間的最大值。
嗯。。。然后被0x7f坑了一把,它給我輸出127。。。
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std
;
struct KK
{int to
,z
,next
;
} a
[10002];
int n
,m
,AA
[5001],BB
[5001],A
,B
,t
=0,L
[5001];
bool b
[5001];
int main(){scanf("%d%d",&n
,&m
);for(int i
=1;i
<=m
;++i
){int x
,y
,l
;scanf("%d%d%d",&x
,&y
,&l
);a
[++t
].to
=y
;a
[t
].z
=l
;a
[t
].next
=L
[x
];L
[x
]=t
;a
[++t
].to
=x
;a
[t
].z
=l
;a
[t
].next
=L
[y
];L
[y
]=t
;}scanf("%d%d",&A
,&B
);memset(AA
,0x7f,sizeof(AA
));memset(BB
,0x7f,sizeof(BB
));queue
<int> Q
;Q
.push(A
);AA
[A
]=0;while(Q
.size()){int l
=Q
.front();Q
.pop();b
[l
]=false;for(int i
=L
[l
];i
;i
=a
[i
].next
)if(AA
[a
[i
].to
]>AA
[l
]+a
[i
].z
){AA
[a
[i
].to
]=AA
[l
]+a
[i
].z
;Q
.push(a
[i
].to
);b
[a
[i
].to
]=true;}}Q
.push(B
);memset(b
,0,sizeof(b
));BB
[B
]=0;while(Q
.size()){int l
=Q
.front();Q
.pop();b
[l
]=false;for(int i
=L
[l
];i
;i
=a
[i
].next
)if(BB
[a
[i
].to
]>BB
[l
]+a
[i
].z
){BB
[a
[i
].to
]=BB
[l
]+a
[i
].z
;Q
.push(a
[i
].to
);b
[a
[i
].to
]=true;}}int Ans
=117901064;for(int i
=1;i
<=n
;++i
)Ans
=min(Ans
,max(AA
[i
],BB
[i
]));if(Ans
>=117901063) printf("Peace!");else printf("%d",Ans
);
}
總結(jié)
以上是生活随笔為你收集整理的【SPFA】腾讯大战360的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。