【网络流24题】最小路径覆盖问题
2018-01-15 20:26
387 查看
Description
click meSolution
性质:DAG最小路径覆盖数等于对应的二分图的最大二分匹配数。最近写网络流写得想吐的,还是匈牙利清新一些
Code
/************************** * Au: Hany01 * Date: Jan 15th, 2018 * Prob: luogu2764 * Email: hany01@foxmail.com **************************/ #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long LL; typedef pair<int, int> PII; #define rep(i, j) for (register int i = 0, i##_end_ = (j); i < i##_end_; ++ i) #define For(i, j, k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i) #define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i) #define Set(a, b) memset(a, b, sizeof(a)) #define Cpy(a, b) memcpy(a, b, sizeof(a)) #define fir first #define sec second #define pb(a) push_back(a) #define mp(a, b) make_pair(a, b) #define ALL(a) (a).begin(), (a).end() #define SZ(a) ((int)(a).size()) #define INF (0x3f3f3f3f) #define INF1 (2139062143) #define Mod (1000000007) #define debug(...) fprintf(stderr, __VA_ARGS__) template <typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; } template <typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; } inline int read() { register int _, __; register char c_; for (_ = 0, __ = 1, c_ = getchar(); c_ < '0' || c_ > '9'; c_ = getchar()) if (c_ == '-') __ = -1; for ( ; c_ >= '0' && c_ <= '9'; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48); return _ * __; } inline void File() { #ifdef hany01 freopen("luogu2764.in", "r", stdin); freopen("luogu2764.out", "w", stdout); #endif } const int maxn = 155, maxm = 6005; int n, m, v[maxm], nex[maxm], beg[maxn], mat[maxn], vis[maxn], e, Ans, ismated[maxn]; inline void add(int uu, int vv) { v[++ e] = vv, nex[e] = beg[uu], beg[uu] = e; } inline void Init() { register int uu, vv; n = read(); m = read(); while (m --) uu = read(), vv = read(), add(uu, vv); } bool dfs(int u) { for (register int i = beg[u]; i; i = nex[i]) if (!vis[v[i]]) { vis[v[i]] = 1; if (!mat[v[i]] || dfs(mat[v[i]])) { mat[v[i]] = u; return 1; } } return 0; } inline void Hungary() { For(i, 1, n) { Set(vis, 0); if (dfs(i)) ++ Ans; } } void findpre(int u) { if (mat[u]) findpre(mat[u]); printf("%d ", u); } inline void Print() { For(i, 1, n) ismated[mat[i]] = 1; For(i, 1, n) if (!ismated[i]) findpre(i), putchar('\n'); printf("%d\n", n - Ans); } int main() { File(); Init(); Hungary(); Print(); return 0; } //令公桃李满天下,何用堂前更种花。 // -- 白居易《奉和令公绿野堂种花》
相关文章推荐
- 【网络流24题】最小路径覆盖问题
- [网络流24题] 最小路径覆盖问题
- 【二分匹配】 [网络流24题] 最小路径覆盖问题
- [网络流24题]魔术球问题(简化版) 最小路径覆盖+二分答案 + 很快的最大流
- 线性规划与网络流24——最小路径覆盖问题
- [网络流24题] 最小路径覆盖问题
- 【网络流24题】最小路径覆盖问题
- nefu481最小路径覆盖问题【网络流24题】
- code vs [网络流24题]最小路径覆盖问题
- 【网络流24题】最小路径覆盖问题
- [网络流24题] 03 最小路径覆盖问题(有向无环图最小路径覆盖,网络最大流)
- 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 ->最大二分匹配)
- 【网络流24题】No.4 魔术球问题 (二分+最小路径覆盖)
- 线性规划与网络流24题 3最小路径覆盖问题 NEFU 481
- Cogs 728. [网络流24题] 最小路径覆盖问题
- [网络流24题] 04 魔术球问题 (有向无环图最小路径覆盖, 最大流)
- 网络流24题 最小路径覆盖问题
- [网络流24题] 最小路径覆盖问题
- [网络流24题] No3_最小路径覆盖问题
- 【codevs1904】[网络流24题]最小路径覆盖问题