Pagini recente » Cod sursa (job #269775) | Cod sursa (job #2369157) | Cod sursa (job #1767470) | Cod sursa (job #272438) | Cod sursa (job #660384)
Cod sursa(job #660384)
#include<fstream>
#include<vector>
// | | |
using namespace std;
const int pinf=0x3f3f3f3f;
int p[1001];
vector<int> aa;
ifstream f("maxflow.in");
ofstream h("maxflow.out");
struct muchie{ long x,y;
}G[500001];
long d[1001],i,n,m,ok,a[1001][1001];
void read(int prim)
{ f>>n>>m;
int c;
for(i=1;i<=m;i++)
{f>>G[i].x>>G[i].y>>c;
a[G[i].x][G[i].y]=c;
if(G[i].x==prim)
aa.push_back(G[i].y);}}
void solve(int prim)
{ for(i=1;i<=n;i++)
if(d[i]==0)
d[i]=pinf;
do{ok=1;
for(i=1;i<=m;i++)
{if(d[G[i].y] > d[G[i].x]+1&&a[G[i].x][G[i].y]>0)
{d[G[i].y] = d[G[i].x]+1;
p[G[i].y]=G[i].x;
ok=0; }
if(d[G[i].x] > d[G[i].y]+1&&a[G[i].y][G[i].x]>0)
{d[G[i].x] = d[G[i].y]+1;
p[G[i].x]=G[i].y;
ok=0; }}}
while(!ok);}
int main()
{int i,min,S=0;
read(1);
while(1!=0)
{for(int i=1;i<=n;i++)
{p[i]=0;
d[i]=0;}
for(int i=0;i<aa.size();i++)
if(a[1][aa[i]]>0)
{d[aa[i]]=1;
p[aa[i]]=1;}
solve(1);
if(p[n]==0)
break;
i=n;
min=pinf;
while(i!=1)
{if(a[p[i]][i]<min)
min=a[p[i]][i];
i=p[i];}
S=S+min;
i=n;
while(i!=1)
{a[p[i]][i]=a[p[i]][i]-min;
a[i][p[i]]=a[i][p[i]]+min;
i=p[i];}}
for(int i=1;i<=n;i++)
{p[i]=0;
d[i]=0;}
for(int i=0;i<aa.size();i++)
if(a[1][aa[i]]>0)
{d[aa[i]]=1;
p[aa[i]]=1;}
h<<S;
return 0;}