Pagini recente » Cod sursa (job #978723) | Cod sursa (job #3201252) | Cod sursa (job #1389885) | Cod sursa (job #1375983) | Cod sursa (job #878796)
Cod sursa(job #878796)
#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
int c[1005][1005],f[1005][1005],n,m,v[1005],t[1005],flux;
vector <int> l[1005];
void cit(){
FILE *f;
int a,b,cp,i;
f=fopen("maxflow.in","r");
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=m;i++){
fscanf(f,"%d%d%d",&a,&b,&cp);
l[a].push_back(b);
l[b].push_back(a);
c[a][b]+=cp;
}
fclose(f);
}
void bf(){
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]]==0&&f[k][l[k][i]]<c[k][l[k][i]]){
v[l[k][i]]=1;
t[l[k][i]]=k;
q.push(l[k][i]);
}
}
}
void edmonds_karp(){
int min,k;
bf();
while(v[n]==1){
for(unsigned int i=0;i<l[n].size();i++)
if(v[l[n][i]]&&f[l[n][i]][n]<c[l[n][i]][n]){
t[n]=l[n][i];
min=2000000000;
for(k=n;k!=1;k=t[k])
if(min>c[t[k]][k]-f[t[k]][k])
min=c[t[k]][k]-f[t[k]][k];
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));
bf();
}
}
int main(){
cit();
edmonds_karp();
FILE *f;
f=fopen("maxflow.out","w");
fprintf(f,"%d\n",flux);
fclose(f);
return 0;
}