[資料範圍]每組都是n=5000 m=5000 並且保證運算過程中的所有值都不會超過117901063
輸出只有一行,d,表示二者「相遇」的最短時間。當然,如果無法相遇則輸出「peace!」
一道很水很水的,spfa
嗯,真的很水
至於為什麼早上沒過,純屬傻了————
明明只用做一遍的東西,為什麼做了n遍?是嫌時間太多麼?(並沒有,是忘記了只用做一遍)
qaq,我的分啊!orz。。。。。
時間複雜度o(n+m)
type
arr=array[0..100000]of longint;
var n,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;
begin
if a>b then
exit(a) else
exit(b);
end;
procedure
spfa
(var d:arr;s:longint);
var i,j,k,h,tail:longint;
begin
fillchar(b,sizeof(b),true);
h:=0;tail:=1;v[1]:=s;d[s]:=0;b[s]:=false;
while hdo
begin
inc(h);
k:=ls[v[h]];
while k>0
dobegin
if d[v[h]]+w[k]then
begin
d[y[k]]:=d[v[h]]+w[k];
if b[y[k]] then
begin
inc(tail);
b[y[k]]:=false;
v[tail]:=y[k];
end;
end;
k:=ne[k];
end;
b[v[h]]:=true;
end;
end;
begin
readln(n,m);
for i:=1
to m do
begin
inc(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 do
begin
j:=max(d[i],dz[i]);
if jthen ans:=j;
end;
if ans<>d[0] then writeln(ans) else writeln('peace!');
end.
騰訊與360大戰
致廣大qq使用者的一封信 親愛的qq使用者 當您看到這封信的時候,我們剛剛作出了乙個非常艱難的決定。在360公司停止對qq進行外掛程式侵犯和惡意詆毀之前,我們決定將在裝有360軟體的電腦上停止執行qq軟體。我們深知這樣會給您造成一定的不便,我們誠懇地向您致歉。同時也把作出這一決定的原因寫在下面,盼望...
TYVJ1356(騰訊大戰360)
演算法 最短路 求兩遍最短路,乙個是從起點走向終點,另乙個從終點走向起點,記錄下每次走每個點的最短路,然後列舉一遍,對於每個點,找乙個最大的最短路看能否更新min。program p1356 const maxn 10000 type atp record y,dis,next longint en...
SSL ZYC 2133 騰訊大戰360
題目大意 兩個人分別在s和e這兩個點上,已知兩人可以同時行走,且他們的相遇地必須是乙個點 不能在路上相遇 那麼他們最短相遇時間是多少?思路 這道題很明顯是一道並查集 最短路問題。先用並查集求出兩點之間是否有通路,再跑兩次dij,列舉每乙個點,求出他們兩人中用時較長的最小值。這道題也可以用spfa。而...