[24 questions about network stream] minimum path coverage (Bipartite Graph Matching) programming questions, 24 bipartite
Question
Principle: Minimum path overwrite = point-matching number;
It is easy to understand: the two points can be matched, which is equivalent to putting them in and querying the set, and querying the number of sets is the number of paths;
However, my understanding of graph creation is always incorrect;
I ran a Binary Graph dyeing and divided it into two sets and ran a Binary Graph Matching. The error was that I did not split the points;
So I think that each vertex can only go once, so each vertex is connected to a side with a capacity of 1. The error is that there is no connection between electricity and points,No adjustment function;
The correct method for creating a graph is as follows: each vertex is split into I + n but not connected; S is connected to I Capacity 1; I + n is connected to T capacity 1; if the two vertices are connected to x and are connected to y + n (this is a clever way of creating a graph), we can say that the two vertices haveInvisibleContact;
Take 1-> 2-> 3 as an example.
However, it is difficult for me to create a graph. nxt [] and pre [] record the successor and precursor of the vertex respectively, and recursive output; <喎?https: www.bkjia.com kf ware vc " target="_blank" class="keylink"> VcD4NCjxoMiBpZD0 = "code"> code
# Include
# Include
# Include
# Include
Using namespace std; const int maxn = 1000001; const int inf = 1e9; queue
Q; int n, m, k, maxflow, a [maxn], S, T; struct Edge {int next, to, dis;} edge [maxn <1]; int num_edge =-1, head [maxn], cur [maxn], deep [maxn]; int nxt [maxn], pre [maxn]; // which void add_edge (int from, int to, int dis) {edge [++ num_edge] is the first vertex and the last vertex of vertex I? next = head [from]; edge [num_edge]. dis = dis; edge [num_edge]. to = to; head [from] = num_edge;} void add (int x, int y, int z) {add_edge (x, y, z); add_edge (y, x, 0);} bool bfs (int s, int t) {mems Et (deep, 0x7f, sizeof (deep); for (int I = 0; I <= t; I ++) cur [I] = head [I]; while (! Q. empty () q. pop (); q. push (s); deep [s] = 0; while (! Q. empty () {int now = q. front (); q. pop (); for (int I = head [now]; I! =-1; I = edge [I]. next) {int to = edge [I]. to; if (deep [to]> inf & edge [I]. dis) {deep [to] = deep [now] + 1; q. push (to) ;}}return deep [t]
Summary
Output Method
<