这是来自zjut-vegetable的好东西~~收藏下,邻接表是个好东西!
#include
<
iostream
>
using namespace std;
const int maxn = 205 ;
const int inf = 1000000000 ;
int pre[maxn],que[maxn],d[maxn],v[maxn];
struct node
{
int v,val,next;
}s[ 505 ];
int flow[ 505 ];
int p[ 205 ];
int ind;
int id[ 505 ];
int maxflow( int source, int sink)
{
int h,r,ret = 0 ,i,j,k;
memset(flow, 0 , sizeof (flow));
for (;;)
{
memset(v, 0 , sizeof (v));
memset(d, 0 , sizeof (d));
que[ 0 ] = source;
v[source] = 1 ;
d[source] = inf;
h = r = 0 ;
while (h <= r &&! v[sink])
{
k = que[h ++ ];
for ( int q = p[k];q !=- 1 ;q = s[q].next)
{
i = s[q].v;
if ( ! v[i] && flow[q] < s[q].val)
{
v[i] = 1 ;
que[ ++ r] = i;
pre[i] = k;
id[i] = q;
d[i] = min(s[q].val - flow[q],d[k]);
}
}
}
if ( ! v[sink]) break ;
ret += d[sink];
for (i = sink;i != source;)
{
j = i;
i = pre[i];
flow[id[j]] += d[sink];
k = id[j];
if (k < ind)
k += ind;
else
k -= ind;
flow[k] =- flow[id[j]];
}
}
return ret;
}
int main()
{
int m,n;
while (cin >> m >> n)
{
int x,y,z;
memset(p, - 1 , sizeof (p));
ind = m;
for ( int i = 0 ;i < m;i ++ )
{
cin >> x >> y >> z;
s[i].v = y;
s[i].next = p[x];
s[i].val = z;
p[x] = i;
s[i + m].v = x;
s[i + m].next = p[y];
s[i + m].val = 0 ;
p[y] = i + m;
}
cout << maxflow( 1 ,n) << endl;
}
}
using namespace std;
const int maxn = 205 ;
const int inf = 1000000000 ;
int pre[maxn],que[maxn],d[maxn],v[maxn];
struct node
{
int v,val,next;
}s[ 505 ];
int flow[ 505 ];
int p[ 205 ];
int ind;
int id[ 505 ];
int maxflow( int source, int sink)
{
int h,r,ret = 0 ,i,j,k;
memset(flow, 0 , sizeof (flow));
for (;;)
{
memset(v, 0 , sizeof (v));
memset(d, 0 , sizeof (d));
que[ 0 ] = source;
v[source] = 1 ;
d[source] = inf;
h = r = 0 ;
while (h <= r &&! v[sink])
{
k = que[h ++ ];
for ( int q = p[k];q !=- 1 ;q = s[q].next)
{
i = s[q].v;
if ( ! v[i] && flow[q] < s[q].val)
{
v[i] = 1 ;
que[ ++ r] = i;
pre[i] = k;
id[i] = q;
d[i] = min(s[q].val - flow[q],d[k]);
}
}
}
if ( ! v[sink]) break ;
ret += d[sink];
for (i = sink;i != source;)
{
j = i;
i = pre[i];
flow[id[j]] += d[sink];
k = id[j];
if (k < ind)
k += ind;
else
k -= ind;
flow[k] =- flow[id[j]];
}
}
return ret;
}
int main()
{
int m,n;
while (cin >> m >> n)
{
int x,y,z;
memset(p, - 1 , sizeof (p));
ind = m;
for ( int i = 0 ;i < m;i ++ )
{
cin >> x >> y >> z;
s[i].v = y;
s[i].next = p[x];
s[i].val = z;
p[x] = i;
s[i + m].v = x;
s[i + m].next = p[y];
s[i + m].val = 0 ;
p[y] = i + m;
}
cout << maxflow( 1 ,n) << endl;
}
}