Pagini recente » Cod sursa (job #1652170) | Cod sursa (job #1113663) | Cod sursa (job #2344936) | Cod sursa (job #739671) | Cod sursa (job #883026)
Cod sursa(job #883026)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
#define pb push_back
#define maxn 1005
int n,m;
int disp[maxn][maxn];
int used[maxn][maxn];
int TT[maxn];
int Q[maxn];
bool viz[maxn];
vector<int> graf[maxn];
void read()
{
int a,b,c;
in >> n >> m;
while(m--)
{
in >> a >> b >> c;
disp[a][b]+= c;
graf[a].pb(b);
graf[b].pb(a);
}
}
vector<int> :: iterator it;
bool BFS()
{
memset(viz,0,sizeof(viz));
viz[1]=1;
Q[0]=1;
Q[1]=1;
int i,now;
for(i=1;i<=Q[0];++i)
{
now = Q[i];
if(now == n)
continue;
for(it=graf[now].begin();it != graf[now].end(); ++ it)
{
if(disp[now][*it] == used[now][*it] || viz[*it])
continue;
viz[*it]=1;
Q[++Q[0]]=*it;
TT[*it]=now;
}
}
return viz[n];
}
int main()
{
int flow = 0,now,fmin;
read();
for(;BFS();)
{
for(it = graf[n].begin(); it != graf[n].end(); ++ it)
{
if(used[*it][n] == disp[*it][n] || !viz[*it])
continue;
TT[n] = *it;
fmin = 1 << 28;
for(now=n;now != 1; now = TT[now])
fmin = min(fmin,disp[TT[now]][now] - used[TT[now]][now]);
if(!fmin)
continue;
for(now=n;now != 1;now = TT[now])
{
used[TT[now]][now] += fmin;
used[now][TT[now]] -= fmin;
}
flow += fmin;
}
}
out << flow << "\n";
return 0;
}