最大流学习hdu3549 && 4920二分图匹配
来源:互联网 发布:tensorflow lite官网 编辑:程序博客网 时间:2024/05/18 13:04
Dinic算法:O(E * V^2)
#include<bits/stdc++.h>using namespace std;const int maxn = 500 + 10;typedef long long ll;#define clr(x,y) memset(x,y,sizeof x)#define INF 0x3f3f3f3fstruct Edge{ Edge(int x,int y,int z):to(x),cap(y),rev(z){} int to,cap,rev;};vector<Edge>G[maxn];int n,m;void add_edge(int x,int y,int z){ G[x].push_back(Edge(y,z,G[y].size())); G[y].push_back(Edge(x,0,G[x].size() - 1));}int level[maxn];int iter[maxn];void bfs(int s){ clr(level,-1); queue<int>q; q.push(s); level[s] = 0; while(!q.empty()) { int u = q.front();q.pop(); for(int i = 0; i < G[u].size(); i ++) { Edge e = G[u][i]; if(e.cap > 0 && level[e.to] < 0) { level[e.to] = level[u] + 1; q.push(e.to); } } }}int dfs(int u,int t,int f){ if(u == t) return f; for(int &i = iter[u]; i < G[u].size(); i ++) { Edge &e = G[u][i]; if(e.cap > 0 && level[e.to] > level[u]) { int d = dfs(e.to,t,min(f,e.cap)); if(d > 0) { e.cap -= d,G[e.to][e.rev].cap += d; return d; } } } return 0;}int max_flow(int s,int t){ int flow =0; while(true) { bfs(s); if(level[t] < 0)return flow; clr(iter,0); int f; while((f = dfs(s,t,INF)) > 0) flow += f; }}int main(){ int Tcase; scanf("%d",&Tcase); for(int ii = 1; ii <= Tcase; ii ++) { scanf("%d%d",&n,&m); for(int i = 0; i <= n; i ++)G[i].clear(); for(int i = 1; i <= m; i ++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add_edge(x,y,z); } printf("Case %d: %d\n",ii,max_flow(1,n)); } return 0;}
hdu2063
二分图匹配算法:对于无向图而言:
#include<bits/stdc++.h>using namespace std;const int maxn = 1000 + 10;typedef long long ll;#define clr(x,y) memset(x,y,sizeof x)#define INF 0x3f3f3f3fvector<int>g[maxn];int k,m,n;bool vis[maxn];int match[maxn];bool dfs(int u){ vis[u] = true; for(int i = 0; i < g[u].size(); i ++) { int v = g[u][i], w = match[v]; if(w < 0 || !vis[w] && dfs(w)) { match[u] = v;match[v] = u; return true; } } return false;}int binary_match(){ int ret = 0; clr(match,-1); for(int i = 1; i <= n; i ++) { if(match[i] < 0) { clr(vis,false); if(dfs(i)) ret ++; } } return ret;}int main(){ while( ~ scanf("%d",&k) && k) { scanf("%d%d",&n,&m); for(int i = 1; i <= n; i ++) g[i].clear(); for(int i = 1; i <= k;i ++) { int x,y; scanf("%d%d",&x,&y); g[x].push_back(y + n); g[y + n].push_back(x); } printf("%d\n",binary_match()); } return 0;}
若图为有向图的话,寻找增广路的时候加上match[v] = u就行了,而不需要 match[u] = v了。
阅读全文
0 0
- 最大流学习hdu3549 && 4920二分图匹配
- hdu3549最大流
- 最大流HDU3549
- bzoj1433_最大流|二分图最大匹配
- 学习笔记----二分图的最大匹配
- 二分图最大匹配
- 二分图最大匹配 。
- 二分图最大匹配
- 二分图最大匹配
- 二分图最大匹配
- 二分图最大匹配
- 二分图 最大匹配
- 二分图最大匹配
- 二分图最大匹配
- 二分图最大匹配
- 二分图最大匹配
- 二分图最大匹配
- 二分图最大匹配
- 常见的提高高并发下访问的效率的手段
- HashMap死循环记录
- c++动态内存管理相关知识
- 实习日志-2
- LEAST() GREATEST()
- 最大流学习hdu3549 && 4920二分图匹配
- windows上用pycharm调试python代码
- 基础数据结构算法_哈夫曼树
- iOS上线版本9.3以下系统,使用很短时间崩溃问题
- mysql 数据库入门
- 一脸懵逼之Kotlin使用ButterKnife无效问题
- studio经典报错 解决
- STEVEY对AMAZON和GOOGLE平台的吐槽
- 关于微信js-sdk拍照功能