Pagini recente » Cod sursa (job #1516251) | Cod sursa (job #198160) | Cod sursa (job #300149) | Cod sursa (job #1193678) | Cod sursa (job #928228)
Cod sursa(job #928228)
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
#define MAX_N 1000
#define MAX_M 5000
#define INF 2000000000
using namespace std;
struct nod
{
int nr,cost;
nod *next;
}*First[MAX_N+5];
int N,M,Flow;
int Cap[MAX_N+5][MAX_N+5],Cost[MAX_N][MAX_N],T[MAX_N+5],Visited[MAX_N];
void Insert(int x,int y,int cost)
{
nod *q=new nod;
q->nr=y;
q->cost=cost;
q->next=First[x];
First[x]=q;
}
void Read()
{
ifstream fin("maxflow.in");
fin>>N>>M;
int i,x,y,cost;
for(i=1;i<=M;i++)
{
fin>>x>>y>>cost;
//if(x==y)
// continue;
Insert(x,y,cost);
Cap[x][y]=cost;
}
}
int Road()
{
int c[MAX_N+5],i,cur,p=1,u=1;
c[p]=1;
memset(T,0,sizeof(T));
memset(Visited,0,sizeof(Visited));
T[1]=0;
Visited[1]=1;
nod *q;
while(p<=u)
{
cur=c[p];
for(q=First[cur];q;q=q->next)
{
i=q->nr;
if(Cap[cur][i]-Cost[cur][i]>0&&Visited[i]==0)
{
u++;
c[u]=i;
T[i]=cur;
Visited[cur]=1;
if(i==N)
return 1;
}
}
p++;
}
return 0;
}
void write_road(int k)
{
// printf(" / t[%d]=%d -> ",k,T[k]);
if(T[k]==0){
printf("1 ");
return;
}
write_road(T[k]);
printf("%d ",k);
}
void Solve(int k,int &min)
{
if(T[k]>0)
{
if(Cap[T[k]][k]-Cost[T[k]][k]>0&&min>Cap[T[k]][k]-Cost[T[k]][k])
min=Cap[T[k]][k]-Cost[T[k]][k];
Solve(T[k],min);
Cost[T[k]][k]+=min;
Cost[k][T[k]]-=min;
}
}
int ReturnFlux()
{
nod *q;
int s=0;
for(q=First[1];q;q=q->next)
{
s+=Cap[q->nr][1];
}
return s;
}
int main()
{
Read();
int sw=Road(),min=INF;
while(sw)
{
/* write_road(N);
printf("\n");*/
min=INF;
Solve(N,min);
Flow+=min;
sw=Road();
}
freopen("maxflow.out","w",stdout);
printf("%d\n",Flow);
fclose(stdout);
return 0;
}