解题报告 聚会
1.????????題目
聚會?(FTT)
【問題描述】
小S想要從某地出發去同學k的家中參加一個party,但要有去有回。他想讓所用的時間盡量的短。但他又想知道從不同的點出發,來回的最短時間中最長的時間是多少,
這個任務就交給了你。
【輸入格式】
第一行三個正整數n,m,k(n是節點個數,m是有向邊的條數,k是參加聚會的地點編號)(?1?≤?N?≤?1000?,1?≤?M?≤?100,000)
第二行..m+1行每行3個整數x,y,w?代表從x到y需要花w的時間(1?≤?w≤?100)
【輸出格式】
???輸出從不同的節點出發的最短時間中最長的時間。
【樣例輸入】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.????????題目實質
其實這個東西就是一個最短路的模型。
3.????????算法
我說是網絡流......你信不?
廢話,當然是最短路!
每個點到K節點的最短路?+?K到對應的點的最短路
以除K以外的點到K的最短路反復的求就有了很多的冗余,會超時
可以思考從其他的點到K點的最短路等價于從K點出發使用反向邊求到各個點的最短路
這樣這道題就完美的解決了?ans=max{dis1[i][k]+dis2[i][k]}
4.????????注意事項
注意,這個題是非常典型的需要正著求一遍,反著求一遍的最短路。
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.
?
?
?
?
?
轉載于:https://www.cnblogs.com/SueMiller/archive/2011/10/11/2207802.html
總結
- 上一篇: CRS中常用的OCR和Votedisk的
- 下一篇: 《那些年啊,那些事——一个程序员的奋斗史