Pagini recente » Cod sursa (job #2942807) | Cod sursa (job #1699430) | Cod sursa (job #1804079) | Cod sursa (job #1856363) | Cod sursa (job #748851)
Cod sursa(job #748851)
#include<iostream>
#include<fstream>
using namespace std;
#include<queue>
#define maxn 1005
#define maxm 5005
int const maxc=110005;
struct lista{
int vec;
lista *next;
};
lista *v[maxn];
queue <int> coada;
int c[maxn][maxn],flux[maxn][maxn],pred[maxn],cf[maxn][maxn];
FILE *f,*g;
void citire(int &N, int &M){
f=fopen("maxflow.in","r");
g=fopen("maxflow.out","w");
fscanf (f, "%d", &N);
fscanf (f, "%d", &M);
int varf1,varf2;
lista *p,*q;
for(int i=1;i<=M;i++){
fscanf (f, "%d", &varf1);
fscanf (f, "%d", &varf2);
fscanf (f, "%d", &c[varf1][varf2]);
cf[varf1][varf2]=c[varf1][varf2];
p=v[varf1];
if(p==NULL){
p=new lista;
p->vec=varf2;
p->next=NULL;
v[varf1]=p;
}
else{
q=new lista;
q->next=p;
q->vec=varf2;
v[varf1]=q;
}
}
}
int drum(int N,bool viz[maxn]){
for(int i=1;i<=N;i++){
pred[i]=0;
viz[i]=0;
}
lista *p;
coada.push(1);
viz[1]=1;
while(!coada.empty()){
int k=coada.front();
p=v[k];
coada.pop();
while(p!=NULL){
if(viz[p->vec]==0&&cf[k][p->vec]){
coada.push(p->vec);
pred[p->vec]=k;
viz[p->vec]=1;
if(p->vec==N)
return 1;
p=p->next;
}
else
p=p->next;
if(p==NULL&&!coada.empty()){
k=coada.front();
p=v[k];
coada.pop();
}
}
}
return 0;
}
void max_flow(int N,bool viz[maxn]){
int maxf=0,min=maxc;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
flux[i][j]=0;
while(drum(N,viz)){
int k=N;
while(pred[k]){
if(cf[pred[k]][k]&&cf[pred[k]][k]<min){
min=cf[pred[k]][k];
}
k=pred[k];
}
k=N;
while(pred[k]){
flux[pred[k]][k]+=min;
cf[pred[k]][k]-=min;
k=pred[k];
}
while(!coada.empty())
coada.pop();
}
lista *p;
p=v[1];
while(p!=NULL){
maxf+=flux[1][p->vec];
p=p->next;
}
fprintf(g,"%d", maxf);
}
int main(){
int N,M;
bool viz[maxn];
citire(N,M);
max_flow(N,viz);
return 0;
}