解题报告 聚会
1.????????題目
聚會(huì)?(FTT)
【問(wèn)題描述】
小S想要從某地出發(fā)去同學(xué)k的家中參加一個(gè)party,但要有去有回。他想讓所用的時(shí)間盡量的短。但他又想知道從不同的點(diǎn)出發(fā),來(lái)回的最短時(shí)間中最長(zhǎng)的時(shí)間是多少,
這個(gè)任務(wù)就交給了你。
【輸入格式】
第一行三個(gè)正整數(shù)n,m,k(n是節(jié)點(diǎn)個(gè)數(shù),m是有向邊的條數(shù),k是參加聚會(huì)的地點(diǎn)編號(hào))(?1?≤?N?≤?1000?,1?≤?M?≤?100,000)
第二行..m+1行每行3個(gè)整數(shù)x,y,w?代表從x到y(tǒng)需要花w的時(shí)間(1?≤?w≤?100)
【輸出格式】
???輸出從不同的節(jié)點(diǎn)出發(fā)的最短時(shí)間中最長(zhǎng)的時(shí)間。
【樣例輸入】party.in
4?8?2
1?2?4
1?3?2
1?4?7
2?1?1
2?3?5
3?1?2
3?4?4
4?2?3
【樣例輸出】party.out
10
?
2.????????題目實(shí)質(zhì)
其實(shí)這個(gè)東西就是一個(gè)最短路的模型。
3.????????算法
我說(shuō)是網(wǎng)絡(luò)流......你信不?
廢話,當(dāng)然是最短路!
每個(gè)點(diǎn)到K節(jié)點(diǎn)的最短路?+?K到對(duì)應(yīng)的點(diǎn)的最短路
以除K以外的點(diǎn)到K的最短路反復(fù)的求就有了很多的冗余,會(huì)超時(shí)
可以思考從其他的點(diǎn)到K點(diǎn)的最短路等價(jià)于從K點(diǎn)出發(fā)使用反向邊求到各個(gè)點(diǎn)的最短路
這樣這道題就完美的解決了?ans=max{dis1[i][k]+dis2[i][k]}
4.????????注意事項(xiàng)
注意,這個(gè)題是非常典型的需要正著求一遍,反著求一遍的最短路。
5.????????代碼
水水最短路?(Leve)
var
?n,m,k,i,j,ans:longint;
?x,y,len:longint;
?d:array[1..1000]?of?longint;
?sum:array[1..1000]?of?longint;
?map,mapp:array[1..1000,0..1000]?of?longint;
?ll,lll:array[1..1000,1..1000]?of?longint;
?q:array[1..1000000]?of?longint;
?v:array[1..1000]?of?boolean;
procedure?spfa(x:longint);
?var
??i,l,r,temp:longint;
?begin
??filldword(d,sizeof(d)>>2,maxlongint>>1);
??fillchar(v,sizeof(v),false);
??v[x]:=true;
??l:=0;?r:=1;
??d[x]:=0;
??q[1]:=x;
??while?l<r?do
???begin
????inc(l);
temp:=q[l];
v[temp]:=false;
for?i:=1?to?map[temp,0]?do
?if?d[map[temp,i]]>d[temp]+ll[temp,i]?then
??begin
???d[map[temp,i]]:=d[temp]+ll[temp,i];
???if?not?v[map[temp,i]]?then
????begin
?v[map[temp,i]]:=true;
?inc(r);
????q[r]:=map[temp,i];
end;
?end;
???end;
?end;
procedure?spfa2(x:longint);
?var
??i,l,r,temp:longint;
?begin
??filldword(d,sizeof(d)>>2,maxlongint>>1);
??fillchar(v,sizeof(v),false);
??v[x]:=true;
??l:=0;?r:=1;
??d[x]:=0;
??q[1]:=x;
??while?l<r?do
???begin
????inc(l);
temp:=q[l];
v[temp]:=false;
for?i:=1?to?mapp[temp,0]?do
?if?d[mapp[temp,i]]>d[temp]+lll[temp,i]?then
??begin
???d[mapp[temp,i]]:=d[temp]+lll[temp,i];
???if?not?v[mapp[temp,i]]?then
????begin
?v[mapp[temp,i]]:=true;
?inc(r);
????q[r]:=mapp[temp,i];
end;
?end;
???end;
?end;
begin
?assign(input,'party.in');
?assign(output,'party.out');
?reset(input);
?rewrite(output);
?readln(n,m,k);
?for?i:=1?to?m?do
??begin
???readln(x,y,len);
???inc(map[x,0]);
???map[x,map[x,0]]:=y;
???ll[x,map[x,0]]:=len;
???inc(mapp[y,0]);
???mapp[y,mapp[y,0]]:=x;
???lll[y,mapp[y,0]]:=len;
??end;
?spfa(k);
?for?i:=1?to?n?do
??sum[i]:=d[i];
?spfa2(k);
?for?i:=1?to?n?do
??if?i<>k?then
???if?d[i]<maxlongint>>1?then
????if?sum[i]<maxlongint>>1?then
?????if?d[i]+sum[i]>ans?then?ans:=d[i]+sum[i];
?writeln(ans);
?close(input);
?close(output);
end.
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/SueMiller/archive/2011/10/11/2207802.html
總結(jié)
- 上一篇: CRS中常用的OCR和Votedisk的
- 下一篇: 《那些年啊,那些事——一个程序员的奋斗史