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 0x3f3f3f3f
struct 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 0x3f3f3f3f
vector<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了。