SDOI2010 星際競速

2021-07-08 09:30:24 字數 3015 閱讀 7316

10年一度的銀河系賽車大賽又要開始了。作為全銀河最盛大的活動之一,奪得這個專案的冠軍無疑是很多人的夢想,來自傑森座α星的悠悠也是其中之一。

賽車大賽的賽場由n顆行星和m條雙向星際航路構成,其中每顆行星都有乙個不同的引力值。大賽要求車手們從一顆與這n顆行星之間沒有任何航路的天體出發,訪問這n顆行星每顆恰好一次,首先完成這一目標的人獲得勝利。

由於賽制非常開放,很多人駕駛著千奇百怪的自製賽車來參賽。這次悠悠駕駛的賽車名為超能電驢,這是一部凝聚了全銀河最尖端科技結晶的夢幻賽車。作為最高科技的產物,超能電驢有兩種移動模式:高速航行模式和能力爆發模式。在高速航行模式下,超能電驢會展開反物質引擎,以數倍於光速的速度沿星際航路高速航行。在能力爆發模式下,超能電驢脫離時空的束縛,使用超能力進行空間跳躍——在經過一段時間的定位之後,它能瞬間移動到任意乙個行星。

天不遂人願,在比賽的前一天,超能電驢在一場離子風暴中不幸受損,機能出現了一些障礙:在使用高速航行模式的時候,只能由每個星球飛往引力比它大的星球,否則賽車就會發生**。

儘管心愛的賽車出了問題,但是悠悠仍然堅信自己可以取得勝利。他找到了全銀河最聰明的賢者——你,請你為他安排一條比賽的方案,使得他能夠用最少的時間完成比賽。

這道題就是給你乙個圖,讓你求遍歷每乙個點使得費用最小,且每個點只能走一次。

那麼我們便可以去思考了,這道題的等價的是讓你找方案的同時費用最小,那麼自然就是最小費用最大流了。

我們接著去想如何建圖。

我們先往最大流的角度去思考,那麼就往每個點向源點和匯點連一條流量為x,費用為0邊,才能保證這是流的出來的。

那麼我們接著考慮x是多少,因為這題要求沒個點只能走一次,所以x=1.

然後我們便可以相互連邊。

但我們會發現,我們很難去處理瞬移,怎麼辦呢?

我們便可以拆點!

所以我們便大致確定了:

從源點向x』連費用為瞬移費用,容量為1的邊。

從源點向x連費用為0,容量為1的邊。

從源點向x連y』費用為高速費用,容量為1的邊。(這個和上面的連邊就是指這個點流1,也就是控制成每個點只能走一次)

從x』向匯點連費用為0,容量為1的邊。(x』->t指的是已經走過這個點了)

var

i,n,m,nu,t,x,y,z,ans,ts:longint;

dis:array[0..2001] of longint;

d:array[1..100000] of longint;

las,nex,b,f,v,re:array[0..60000] of longint;

bz:array[0..2001] of boolean;

procedure

insert

(x,y,z,k:longint);

begin

inc(nu);b[nu]:=y;nex[nu]:=las[x];las[x]:=nu;f[nu]:=z;v[nu]:=k;

inc(nu);b[nu]:=x;nex[nu]:=las[y];las[y]:=nu;f[nu]:=0;v[nu]:=-k;

end;

function

min(l,r:longint):longint;

begin

if lthen

exit(l);exit(r);

end;

function

spfa:boolean;

var l,r,p:longint;

begin

l:=0;r:=1;d[1]:=0;fillchar(dis,sizeof(dis),127);fillchar(bz,sizeof(bz),false);dis[0]:=0;bz[0]:=true;

while ldo

begin

inc(l);p:=las[d[l]];

while p<>0

dobegin

if (dis[b[p]]>dis[d[l]]+v[p])and(f[p]>0) then

begin

dis[b[p]]:=dis[d[l]]+v[p];re[b[p]]:=p;

ifnot bz[b[p]] then

begin bz[b[p]]:=true;inc(r);d[r]:=b[p];end;

end;p:=nex[p];

end;bz[d[l]]:=false;

end;

if dis[t]<>dis[2001] then ans:=ans+dis[t];

exit(dis[t]<>dis[2001]);

end;

procedure

find;

var x,sum,p:longint;

begin

x:=t;sum:=maxlongint;

while x<>0

dobegin

sum:=min(sum,f[re[x]]);x:=b[re[x]xor

1]; end;x:=t;

while x<>0

dobegin

dec(f[re[x]],sum);inc(f[re[x] xor

1],sum);x:=b[re[x]xor

1]; end;

end;

begin

readln(n,m);nu:=1;t:=n*2+1;

for i:=1

to n do

begin

read(x);

insert(0,i,1,0);

insert(0,i+n,1,x);

insert(i+n,t,1,0);

end;

for i:=1

to m do

begin

readln(x,y,z);

if x>y then

begin ts:=x;x:=y;y:=ts;end;

insert(x,n+y,1,z);

end;

while spfa do

find;

writeln(ans);

end.

SDOI2010 星際競速

昨天連續做了兩道網路流 這是第一道 這是道圖論題是肯定的,圖都給你了 那麼問題在於如何建模 問題要求訪問每個點恰好一次 我一開始沒看到這個條件 要求總時間最短,嘗試把問題轉化為一些經典圖論問題比如最短路 很可惜不行,那麼自然想到網路流 組裡面有句戲言叫 一切皆可網路流 比如a b 進一步分析發現單純...

SDOI2010 星際競速

10年一度的銀河系賽車大賽又要開始了。作為全銀河最盛大的活動之一,奪得這個專案的冠軍無疑是很多人的夢想,來自傑森座 星的悠悠也是其中之一。賽車大賽的賽場由n顆行星和m條雙向星際航路構成,其中每顆行星都有乙個不同的引力值。大賽要求車手們從一顆與這n顆行星之間沒有任何航路的天體出發,訪問這n顆行星每顆恰...

SDOI2010 星際競速

題解 感覺非常智障。我還仔細看了一下題目這是不是顆樹,然後發現給了邊數 然後就沒往這想了 只能從小到大 顯然的dag性質啊。然後就很簡單了啊。考慮二分圖里最小路徑覆蓋 這題裡,其實也就是找一些路徑,使其覆蓋所有點 這題無非就是增加了費用限制 所以就變成跑最小費用最大流就好了 但是注意到飛躍到每個點是...