輸入 #1複製
11 12輸出 #1複製1 21 3
1 42 5
3 64 7
5 86 9
7 10
8 11
9 11
10 11
1 4 7 10 111\leq n\leq 150,1\leq m\leq 60001≤n≤150,1≤m≤60002 5 8
3 6 9
3
由@flierking提供spj
思路
既然是網路流24中的題目,就從網路流的方法下手吧。
對於樣例來說
其實不難看出這題是和流的路徑有關的。
為了保證每個點只能用一次,
可以考慮把每個點拆成出入兩個點,
它們之間的通道容量為1.
由於起點終點的不確定,
對整張圖建立源點和匯點即可。
code
1 #include 2view code#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 }
#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 的所含路徑條數最少的路徑覆蓋。設計乙個有效演算法求乙個有...