生活随笔
收集整理的這篇文章主要介紹了
SSL P2133 腾讯大战360
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目大意:
有N個點,騰訊與360分別在點S,點T,給出M個a,b,c,表示點a到點b有一條連邊(雙向邊),耗時為c,他們想在最短的時間內相遇,然后干一架。,求二者“相遇”的最短時間,當然,如果無法相遇則輸出“Peace!”
在此我們定義“相遇”為:兩個人皆在同一個有編號的城市上就可以了,并且這兩個人均可以站在原地等另外一個人。也就是說,在這里我們不考慮兩人在路中間相遇。
每組數據n=5000 m=5000
并且保證運算過程中的所有值都不會超過117901063
題解:
spfa+鄰接表:
我們用點S(騰訊)到N個點的最短路跑一遍,
結果是dis[1,i]
然后點T(360)同上操作,結果是dis[2,i]
然后在max(dis[1,i],dis[2,i])找個最小值。
因為如果騰訊到點i最少要花費dis[1,i]時間,然后360到點i要話費dis[2,i]時間,這時
如果dis[1,i] < dis[2,i] 那么因為題意是允許在原地等待的,那么360和騰許在第i個點相遇的最短時間,則是dis[2,i],同理,dis[2,i] < dis[1,i]則選擇dis[1,i],等于就直接搞搞即可。
然后有N個點,每次都這么做,然后找最小值。
因此我們就得到答案:
min(max(dis[1,i],dis[2,i]))
然后注意不能相遇要輸出Peace!
時間復雜度:O(3N+2M)
varlist,
s,t,w,
next:array [
0..
10001] of longint;
q:array [
0..
100001,
1..
2] of longint;dis:array [
1..
2,
0..
5001] of longint;v:array [
1..
2,
0..
5001] of boolean;
x,
y,z,xx,yy,i,j,n,
m,d,ans:longint;procedure add(k,aa,bb,cc:longint);
begin
s[k]:=aa;t[k]:=bb;w[k]:=cc;
next[k]:=list[
s[k]];list[
s[k]]:=k;
end;procedure spfa;
varhead,tail,i:longint;
beginhead:=
0;tail:=
1;
for i:=
0 to n
dobegindis[
1,i]:=maxlongint;dis[
2,i]:=maxlongint;end;head:=
0;tail:=
2;dis[
1,
x]:=
0;dis[
2,
y]:=
0;v[
1,
x]:=true;v[
2,
y]:=true;
q[1,1]:=
x;
q[1,2]:=
1;
q[2,1]:=
y;
q[2,2]:=
2;
while head<tail
dobegininc(head);i:=list[
q[head,1]];
while i>
0 dobegin
if dis[
q[head,2],
s[i]]+w[i]<dis[
q[head,2],t[i]]then begindis[
q[head,2],t[i]]:=dis[
q[head,2],
s[i]]+w[i];
if v[
q[head,2],t[i]]=falsethen beginv[
q[head,2],t[i]]:=true;inc(tail);
q[tail,1]:=t[i];
q[tail,2]:=
q[head,2];end;end;i:=
next[i];end;v[
q[head,2],
q[head,1]]:=false;end;
end;function min(aa,bb:longint):longint;
begin
if aa>bb then
exit(bb);
exit(aa);
end;function max(aa,bb:longint):longint;
begin
if aa>bb then
exit(aa);
exit(bb);
end;beginreadln(n,
m);
for i:=
1 to
m dobeginreadln(
x,
y,z);inc(d);add(d,
x,
y,z);inc(d);add(d,
y,
x,z);end;ans:=maxlongint;readln(
x,
y);spfa;
for i:=
1 to n
doif dis[
1,i]<>maxlongint then
if dis[
2,i]<>maxlongint thenans:=min(ans,max(dis[
1,i],dis[
2,i]));
if ans=maxlongintthen writeln(
'Peace!')
else writeln(ans);
end.
總結
以上是生活随笔為你收集整理的SSL P2133 腾讯大战360的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。