Pagini recente » Cod sursa (job #211661) | Cod sursa (job #957423) | Cod sursa (job #1833097) | Cod sursa (job #309403) | Cod sursa (job #729277)
Cod sursa(job #729277)
//nod sursa-1 nod destinatie-n
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
#define nmax 1005
using namespace std;
int n,m,c[nmax][nmax],f[nmax][nmax],t[nmax],v[nmax],flux;
vector <int> l[nmax];
void cit(){
FILE *f;
int i,a,b,cap;
f=fopen("maxflow.in","r");
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=m;i++){
fscanf(f,"%d%d%d",&a,&b,&cap);
c[a][b]+=cap;
l[a].push_back(b);
l[b].push_back(a);
}
fclose(f);
}
void drum(){
int k;
queue <int> q;
q.push(1);
v[1]=1;
while(!q.empty()){
k=q.front();
q.pop();
if(k==n)
continue;
for(unsigned int i=0;i<l[k].size();i++){
if(v[l[k][i]]||c[k][l[k][i]]==f[k][l[k][i]])
continue;
q.push(l[k][i]);
v[l[k][i]]=1;
t[l[k][i]]=k;
}
}
}
void edmonds_karp(){
int k,min;
memset(v,0,sizeof(v));
memset(t,0,sizeof(t));
drum();
while(v[n]==1){
for(unsigned int i=0;i<l[n].size();i++){
k=l[n][i];
if(c[k][n]==f[k][n]||!v[k])
continue;
t[n]=k;
min=2000000000;
for(k=n;k!=1;k=t[k])
if(c[t[k]][k]-f[t[k]][k]<min)
min=c[t[k]][k]-f[t[k]][k];
// if(min!=0){
for(k=n;k!=1;k=t[k]){
f[t[k]][k]+=min;
f[k][t[k]]-=min;
}
flux+=min;
// }
}
memset(v,0,sizeof(v));
memset(t,0,sizeof(t));
drum();
}
}
void afis(){
FILE *f;
f=fopen("maxflow.out","w");
fprintf(f,"%d\n",flux);
fclose(f);
}
int main(){
cit();
edmonds_karp();
afis();
return 0;
}