最小路徑覆蓋問題 網路流24題

2022-05-18 05:35:58 字數 4386 閱讀 5602

輸入 #1複製

11 12

1 21 3

1 42 5

3 64 7

5 86 9

7 10

8 11

9 11

10 11

輸出 #1複製

1 4 7 10 11

2 5 8

3 6 9

3

1\leq n\leq 150,1\leq m\leq 60001≤n≤150,1≤m≤6000

由@flierking提供spj

思路

既然是網路流24中的題目,就從網路流的方法下手吧。

對於樣例來說

其實不難看出這題是和流的路徑有關的。

為了保證每個點只能用一次,

可以考慮把每個點拆成出入兩個點,

它們之間的通道容量為1.

由於起點終點的不確定,

對整張圖建立源點和匯點即可。

code

1 #include 2

#define dbg(x) cout << #x << "=" << x << endl

3#define eps 1e-8

4#define pi acos(-1.0)56

using

namespace

std;

7 typedef long

long

ll;8

9const

int inf = 0x3f3f3f3f;10

11 templateinline void read(t &res)

1217

18namespace

_buff

26return ib == ie ? -1 : *ib++;27}

28}2930

intqread()

38if (c == '-'

) 42

for (; c >= '

0' && c <= '

9'; c =getc())

45return pos ? ret : -ret;46}

4748

const

int maxn = 2e4 + 7;49

50int

s, t, cnt;

51int head[maxn << 1], edge[maxn << 1], nxt[maxn << 1], vis[maxn << 1

];52

int w[maxn << 1];//

殘量網路

53int rev[maxn << 1

];54

int depth[maxn << 1];//

圖層55

intn, m;

5657

void buildgraph(int u, int v, int

cap)

7273

bool bfs(int

x) 78 memset(depth, 63, sizeof

(depth));

79 depth[s] = 0;80

q.push(s);

81do92}

93}94 } while (!q.empty());

95return

false;96

}9798int dfs(int u, int

dist)

102for ( int i = head[u]; i; i =nxt[i] )

113}

114}

115return0;

116}

117118

intmain()

119129

for ( int i = 1; i <= n; ++i )

133int ans = 0

;134

while

(bfs(s))

139for ( int i = 1; i <= n; ++i )

146 printf("

%d "

,temp);

147int x =vis[temp];

148 vis[temp] = 0

;149 temp =x;

150 } while (temp != 0

);151 puts(""

);152

}153

}154 printf("

%d\n

",n -ans);

155return0;

156 }

view code

#include

#define dbg(x) cout << #x << "="

<< x << endl

#define eps 1e-8

#define pi acos(-1.0)

using

namespace

std;

typedef

long

long

ll;

const

intinf =

0x3f3f3f3f

; template

<

class

t>inline

void

read(t &res)

namespace

_buff

return

ib == ie ?

-1: *ib++; } }

intqread()

if(c ==

'-')

for(; c >=

'0'&& c <=

'9'; c = getc())

return

pos ? ret : -ret; }

const

intmaxn =

2e4+ 7;

ints, t, cnt;

inthead[maxn <<

1], edge[maxn <<

1], nxt[maxn <<

1], vis[maxn <<

1];

intw[maxn << 1];

//殘量網路

intrev[maxn <<

1];

intdepth[maxn << 1];

//圖層

intn, m;

void

buildgraph

(int u, int v, int cap)

bool

bfs(int x)

memset

(depth,

63,

sizeof

(depth)); depth[s] =

0; q.push(s);

do } } }

while

(!q.empty());

return

false

; }

intdfs

(int u, int dist)

for( int

i = head[u]; i; i = nxt[i] ) } }

return

0; }

intmain()

for(

inti =

1; i <= n; ++i )

intans = 0;

while

(bfs(s))

for(

inti =

1; i <= n; ++i )

printf

("%d "

,temp);

intx = vis[temp]; vis[temp] =

0; temp = x; }

while

(temp !=

0);

puts(""

); } }

printf

("%d\n"

,n - ans);

return

0; }

網路流24題 最小路徑覆蓋 (最小路徑覆蓋)

題目 給定有向圖g v,e 設p是g的乙個簡單路 頂點不相交 的集合。如果v中每個頂點恰好在p的一條路上,則稱p是g的乙個路徑覆蓋。p中路徑可以從v的任何乙個頂點開始,長度也是任意的,特別地,可以為0。g的最小路徑覆蓋是g的所含路徑條數最少的路徑覆蓋。設計乙個有效演算法求乙個有向無環圖g的最小路徑覆...

網路流24題 最小路徑覆蓋問題

有向無環圖最小路徑覆蓋,可以轉化成二分圖最大匹配問題,從而用最大流解決。構造二分圖,把原圖每個頂點i拆分成二分圖x,y集合中的兩個頂點xi和yi。對於原圖中存在的每條邊 i,j 在二分圖中連線邊 xi,yj 然後把二分圖最大匹配模型轉化為網路流模型,求網路最大流。最小路徑覆蓋的條數,就是原圖頂點數,...

最小路徑覆蓋問題(網路流24題)

問題描述 給定有向圖g v,e 設p 是g 的乙個簡單路 頂點不相交 的集合。如果v 中每個頂點恰好在p 的一條路上,則稱p是g 的乙個路徑覆蓋。p 中路徑可以從v 的任何乙個頂點開始,長度也是任意的,特別地,可以為0。g 的最小路徑覆蓋是g 的所含路徑條數最少的路徑覆蓋。設計乙個有效演算法求乙個有...