(費用流)洛谷P2153 SDOI2009 晨跑

2021-10-16 13:13:18 字數 2026 閱讀 5506

·要求路程盡可能短,天數盡可能長,那麼肯定是最小費用最大流了。天數作為流量,路程作為費用。

按照要求,每個路口只能走一次,這個就是不重複選取的問題,在最大流中的最長不下降子串行問題有涉及到,解決的辦法就是將點拆開,設入點為i

ii,出點為i′i^

i′。然後在之間建一條流量為1

11的邊。

這裡也是相同的,只需要拆點後建一條流量為1

11,費用為0

00的邊即可。由於1

11和n

nn可以使用無限次,所以1

11和1′1^

1′,n

nn和n′n^

n′之間的流量設為inf

infin

f,然後從源點向1

11連一條流量為inf

infin

f,費用為0

00的邊;從n′n^

n′向匯點連一條流量為inf

infin

f,費用為0

00的邊。對於每個街道,從a′a^

a′向b

bb連一條流量為1

11,費用為c

cc的邊。

#include

#define pii pair

#define ll long long

#define cl(x,y) memset(x,y,sizeof(x))

#define loop(x,y,z) for(x=y;x<=z;x++)

#define reve(x,y,z) for(x=y;x>=z;x--)

#define ct cerr<<"time elapsed:"<<1.0*clock()/clocks_per_sec<<"s.\n";

#define mp make_pair

#define pb push_back

#define fi first

#define se second

#define all(x) x.begin(),x.end()

#define lson x<<1,l,mid

#define rson x<<1|1,mid+1,r

#define inf 1e18

const

int n=

1e4+10;

const

int m=

1e6+10;

const

int mod=

1e9+7;

const

int inf=

0x3f3f3f3f

;const

double eps=

1e-8

;const

double pi=

acos(-

1);using

namespace std;

struct edge

e[m]

;int head[n]

,len=

1,dis[n]

,vis[n]

;int maxflow,mincost;

int pre[n]

,path[n]

;void

add(

int u,

int v,

int f,

int w)

; head[u]

=len;

}void

inc(

int u,

int v,

int f,

int w)

intspfa

(int s,

int t)}}

}return pre[t]!=-

1;}voidek(

int s,

int t)

maxflow+

=mi;

mincost+

=dis[t]

*mi;}}

intmain()

ek(s,t)

; cout<" "

}

洛谷 P2153 SDOI2009 晨跑

給出一幅有向無環圖,問從點1到點n有幾條互相沒有交點 除起點終點外不能有公共點 的路徑,保證路徑數量最多的情況下,路徑最大數量與最短的路徑長度之和是多少.與費用流裸題不同的是,不能有公共點,解決方法是將每乙個點拆為乙個入點和乙個出點,流量為1 起點終點不用拆或者流量為inf 建邊時,從乙個點的出點連...

洛谷P2153 SDOI2009 晨跑

elaxia最近迷戀上了空手道,他為自己設定了一套健身計畫,比如俯臥撐 仰臥起坐等 等,不過到目前為止,他堅持下來的只有晨跑。現在給出一張學校附近的地圖,這張地圖中包含n個十字路口和m條街道,elaxia只能從 乙個十字路口跑向另外乙個十字路口,街道之間只在十字路口處相交。elaxia每天從寢室出發...

洛谷P4043 費用流

這題的建圖方式可以模擬洛谷p1251 我是由那個題才想到這麼建的,由於每條邊至少經過一次,我們又不清楚需要跑多少次,把邊看成點,點與匯點相連,可是我們又不知道最大流應該是多少,直接這麼連會發生錯誤。利用那道題的思想,每條邊最少需要一次,那麼就每條邊看做兩個點,點1和點2,點1有1的流量流向匯點,點2...