問題描述:
每條邊的容量均為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 問題描述 飛行大隊有若干個來自各地的駕駛員,專門駕駛一種型號的飛機,這種飛機每架有兩個駕駛員,需乙個正駕駛員和乙個副駕駛員。由於種種原因,例如相互配合的問題,有...