【二分匹配】 [网络流24题] 最小路径覆盖问题
2015-08-10 10:47
671 查看
网络流24题中的经典题目。。。
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn = 305; const int maxm = 20005; struct Edge { int v; Edge *next; }E[maxm], *H[maxn], *edges; int res[maxn]; int vis[maxn]; void addedges(int u, int v) { edges->v = v; edges->next = H[u]; H[u] = edges++; } void init() { edges = E; memset(H, 0, sizeof H); memset(res, -1, sizeof res); } bool find(int u) { for(Edge *e = H[u]; e; e = e->next) if(!vis[e->v]) { int v = e->v; vis[v] = 1; if(res[v] == -1 || find(res[v])) { res[v] = u; return true; } } return false; } int n, m; vector<int> ans; int to[maxn]; void work() { int u, v; for(int i = 1; i <= m; i++) { scanf("%d%d", &u, &v); addedges(u, v); } int result = 0; for(int i = 1; i <= n; i++) { memset(vis, 0, sizeof vis); if(find(i)) result++; } memset(to, 0, sizeof to); for(int i = 1; i <= n; i++) if(res[i] != -1) to[res[i]] = i; for(int i = 1; i <= n; i++) if(res[i] == -1) { ans.clear(); int u = i; ans.push_back(u); while(to[u]) { u = to[u]; ans.push_back(u); } for(int j = 0; j < ans.size(); j++) printf("%d%c", ans[j], j == ans.size() - 1 ? '\n' : ' '); } printf("%d\n", n - result); } int main() { freopen("path3.in", "r", stdin); freopen("path3.out", "w", stdout); while(scanf("%d%d", &n, &m) != EOF) { init(); work(); } return 0; }
相关文章推荐
- 9.3tcp多进程并发模板和多线程并发模板
- 【概率dp,难度3颗星】hdu-5001(2014鞍山网络赛)
- Android 网络:使用URL访问网络资源,ImageView,下载到本地
- ajax开发框架和XMLhttpRequest、responseText、responseXml和JSON的应用
- 打造安全的App!iOS安全系列之 HTTPS
- TCP/IP网络编程 学习笔记_8 --优雅地断开套接字连接
- TCP/IP网络编程 学习笔记_8 --优雅地断开套接字连接
- C++ Builder XE8 安卓开发之使用TidTCPClient控件获取接收数据长度的方法
- 9.2网络-socket2_UDP通信 2015/8/7
- 校园多设备上网难?电信着力改造校园专用网络
- 9.1网络-socket1_TCP通信 2015/8/7
- 安全应急之网络异常排查win&linux-20150805
- httpclient http接口调用
- WCF走HTTP代理服务器进行通信
- ios网络编程(http、socket)
- 转载:HttpClient使用详解
- 打造安全的App!iOS安全系列之 HTTPS
- Ubuntu14.04桥接网络设置与SSH登陆
- html中meta标签的http-equiv的典型用法(转)
- 【网络协议】互联网协议入门(二)