ssl 2603 網路流24題3 最小路徑覆蓋問題

2021-07-25 13:42:51 字數 3744 閱讀 5000

問題描述:

每條邊的容量均為1。求網路g1的( 0 x , 0 y )最大流。

«程式設計任務:

對於給定的給定有向無環圖g,程式設計找出g的乙個最小路徑覆蓋。

輸入輸出格式

輸入格式:

件第1 行有2個正整數n和m。n是給定有向無環圖g 的頂點數,m是g 的邊數。接下來的m行,每行有2 個正整數i和j,表示一條有向邊(i,j)。

輸出格式:

從第1 行開始,每行輸出一條路徑。檔案的最後一行是最少路徑數。

輸入輸出樣例

輸入樣例#1:

11 12

1 2

1 3

1 4

2 5

3 6

4 7

5 8

6 9

7 10

8 11

9 11

10 11

輸出樣例#1:

1 4 7 10 11

2 5 8

3 6 9

3大意:

求乙個圖的最小點路徑覆蓋問題,要輸出覆蓋路徑。

分析:

建立乙個新圖,將g中的每個點i在新圖中拆成兩個點i、i』,若g中存在邊

<

<

i, j>則在新圖中連邊

<

<

i, j』

>

>

,顯然新圖是乙個二分圖,求其最大匹配,則(n-新圖最大匹配的值)就是最小點路徑覆蓋值。

輸出路徑從每個點開始,遍歷一下,因為會跑到i的對點j』,因此下次應該從j開始搜尋,如果一邊的權為0,則有東西流過,就是解。

**:

const

maxn=2003;

maxm=200003;

type

node=record

y,c,next,op:longint;

end;

var e,n,m,s,t,ans,d,x,y,i,j,num:longint;

ls,dis,q,cur,path,v:array [0..maxn] of longint;

g:array [0..maxm*2] of node;

procedure

add(u,v,c:longint);

begin

inc(e);

g[e].y:=v; g[e].c:=c; g[e].op:=e+1; g[e].next:=ls[u]; ls[u]:=e;

inc(e);

g[e].y:=u; g[e].c:=0; g[e].op:=e-1; g[e].next:=ls[v]; ls[v]:=e;

end;

function

bfs:boolean;

var i,head,tail,tt,u:longint;

begin

for i:=s to t do

dis[i]:=0;

dis[s]:=1;

head:=0; tail:=1;

inc(tail);

q[tail]:=s;

while head<=tail do

begin

inc(head);

u:=q[head];

i:=ls[u];

while i>0

dobegin

if (g[i].c<>0) and (dis[g[i].y]=0) then

begin

dis[g[i].y]:=dis[u]+1;

if g[i].y=t then

exit(true);

inc(tail);

q[tail]:=g[i].y;

end;

i:=g[i].next;

end;

end;

exit(false);

end;

function

min(x,y:longint):longint;

begin

if xthen

exit(x)

else

exit(y);

end;

function

dfs(x,maxf:longint):longint;

var ret,i,f:longint;

begin

if (x=t) or (maxf=0) then

exit(maxf);

ret:=0;

i:=cur[x];

while i>0

dobegin

if (g[i].c<>0) and (dis[g[i].y]=dis[x]+1) then

begin

f:=dfs(g[i].y,min(g[i].c,maxf));

dec(g[i].c,f);

inc(g[g[i].op].c,f);

ret:=ret+f;

if ret=maxf then

break;

end;

i:=g[i].next;

end;

exit(ret);

end;

procedure

dinic;

var i:longint;

begin

while bfs do

begin

for i:=s to t do

cur[i]:=ls[i];

ans:=ans+dfs(s,maxlongint);

end;

end;

procedure

find

(x:longint);

var i,y:longint;

begin

if (x>2*n) or (x<0) then

exit;

v[x]:=1;

inc(num);

path[num]:=x;

i:=ls[x];

while i>0

dobegin

y:=g[i].y;

if (v[y]=0) and (y>0) and (g[i].c=0) then

find(y-n);

i:=g[i].next;

end;

end;

begin

readln(n,m);

for i:=1

to m do

begin

readln(x,y);

add(x,y+n,1);

end;

for i:=1

to n do

add(0,i,1);

for i:=n+1

to2*n do

add(i,2*n+1,1);

s:=0; t:=2*n+1;

fillchar(v,sizeof(v),0);

dinic;

for i:=1

to n do

begin

num:=0;

if v[i]=1

then

continue;

fillchar(path,sizeof(path),0);

find(i);

for j:=1

to num do

write(path[j],' ');

writeln;

end;

writeln(n-ans);

end.

COGS461 網路流24題 餐巾

問題描述 乙個餐廳在相繼的n天裡,第i天需要ri塊餐巾 i l,2,n 餐廳可以從三種途徑獲得餐巾。1 購買新的餐巾,每塊需p分 2 把用過的餐巾送到快洗部,洗一塊需m天,費用需f分 f 3 把餐巾送到慢洗部,洗一塊需n天 n m 費用需s分 s在每天結束時,餐廳必須決定多少塊用過的餐巾送到快洗部,...

CTSC1999 網路流24題 家園

題目 洛谷p2754。題目大意 有 n 個空間站,m 個飛船,每個飛船有各自的停靠站點,並且從第乙個停靠站點開始,不斷迴圈。每個飛船有不同的容量 1為月球,0為地球 每個飛船初始停在第乙個停靠站上,每過1s就會到下乙個停靠站。在空間站上的人可以選擇上飛船,也可以選擇不上飛船。現在有 k 個人要從地球...

14 網路流24題 搭配飛行員

14.網路流24題 搭配飛行員 輸入檔案 flyer.in輸出檔案 flyer.out簡單對比 時間限制 1 s 記憶體限制 128 mb 問題描述 飛行大隊有若干個來自各地的駕駛員,專門駕駛一種型號的飛機,這種飛機每架有兩個駕駛員,需乙個正駕駛員和乙個副駕駛員。由於種種原因,例如相互配合的問題,有...