Cod sursa(job #660384)

Utilizator mening12001Andrei Geogescu mening12001 Data 12 ianuarie 2012 19:56:22
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#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;}