| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
求问样例为什么用Dinic跑得6而不是13我用的模板和poj1273一样
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 10010, maxm = 100010;
const int infinit = 0x3fffffff;
class Dinic
{
private:
struct edge
{
int u, v, flow;
edge *next, *rev;
};
edge *edges[maxn], epool[maxm];
int n, ecnt, s, t; // Nodes, EDGE_POOL_COUNTER, source, sink
int level[maxm];
bool __addedge(int u, int v, int flow1, int flow2)
{
edge *p = &epool[ecnt++], *q = &epool[ecnt++];
p -> u = u; p -> v = v; p -> flow = flow1;
p -> next = edges[u]; edges[u] = p; p -> rev = q;
q -> u = v; q -> v = u; q -> flow = flow2;
q -> next = edges[v]; edges[v] = q; q -> rev = p;
return true;
}
queue<int> que;
bool __makelevel(void)
{
memset(level, 0, sizeof(level));
while (!que.empty()) que.pop();
level[s] = 1; que.push(s);
while (!que.empty())
{
int p = que.front();
que.pop();
for (edge* ep = edges[p]; ep; ep = ep -> next)
if (ep -> flow > 0 && !level[ep -> v])
level[ep -> v] = level[p] + 1,
que.push(ep -> v);
if (level[t] > 1)
return true;
}
return false;
}
int __find(int p, int mn)
{
if (p == t)
return mn; // This is the last node
int tmp = 0, alf = 0;
for (edge* ep = edges[p]; ep && alf < mn; ep = ep -> next)
{
if (ep -> flow && level[ep -> v] == level[p] + 1)
{
tmp = __find(ep -> v, min(mn, ep -> flow));
if (tmp)
{
alf += tmp;
ep -> flow -= tmp;
ep -> rev -> flow += tmp;
return tmp;
}
}
}
if (!alf)
level[p] = 0;
return 0; // Which means failure
}
public:
bool addedge(int u, int v, int flow) {
return __addedge(u, v, flow, 0); }
bool addedge(int u, int v, int flow1, int flow2) {
return __addedge(u, v, flow1, flow2); }
bool init(void)
{
memset(edges, 0, sizeof(edges));
memset(epool, 0, sizeof(epool));
memset(level, 0, sizeof(level));
n = s = t = ecnt = 0;
return true;
}
Dinic(void) {
init(); }
bool set_params(int _n, int _s, int _t)
{
if (_s <= 0 || _n < 2 || _t > _n)
return false;
n = _n; s = _s; t = _t;
return true;
}
int result;
bool run_maxflow(void)
{
int sum = 0, tmp, found = 1;
while (__makelevel())
{
found = 0;
while (tmp = __find(s, infinit))
sum += tmp,
found = 1;
if (!found)
break;
}
result = sum;
return true;
}
int get_maxflow(void)
{
return result;
}
};
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator