Pagini recente » Cod sursa (job #1548128) | Cod sursa (job #1924427) | Cod sursa (job #159699) | Cod sursa (job #62899) | Cod sursa (job #698805)
Cod sursa(job #698805)
#include <stdio.h>
#include <vector>
#include <queue>
#include <values.h>
using namespace std;
FILE * fin;
FILE * fout;
struct TEdge
{
int Dest, Capacity, Value;
};
vector <TEdge> v[1001];
queue <int> que;
int visited[1001];
int preview[1001];
int n,m;
//--------------------------------------
void citire()
{
fin = fopen("maxflow.in","r");
fout = fopen("maxflow.out","w");
fscanf(fin,"%d %d",&n,&m);
int Node;
TEdge nod;
for (int i=0; i<m; i++)
{
fscanf(fin,"%d %d %d",&Node,&nod.Dest,&nod.Capacity);
nod.Value=0;
v[Node].push_back(nod);
}
fclose(fin);
}
//--------------------------------------
int BFS()
{
int Node,i,Dest;
que.push(1);
for (i=2; i<=n; i++)
{
visited[i]=0;
preview[i]=0;
}
while (que.size()>0)
{
Node=que.front();
que.pop();
for (int i=0; i<v[Node].size(); i++)
{
Dest=v[Node][i].Dest;
if (visited[Dest]==0)
if (v[Node][i].Capacity>v[Node][i].Value)
{
que.push(Dest);
preview[Dest]=Node;
visited[Dest]=1;
}
}
}
if (preview[n]!=0)
{
return 1;
} else return 0;
}
//--------------------------------------
void solve()
{
int Node;
int a,i,minimum;
while (BFS()==1)
{
minimum=INT_MAX;
Node=n;
while (preview[Node]!=0)
{
a=Node;
Node=preview[Node];
for (i=0; i<v[Node].size(); i++)
if (v[Node][i].Dest==a)
if (minimum>v[Node][i].Capacity-v[Node][i].Value)
{
minimum=v[Node][i].Capacity-v[Node][i].Value;
break;
}
}
Node=n;
while (preview[Node]!=0)
{
a=Node;
Node=preview[Node];
for (i=0; i<v[Node].size(); i++)
if (v[Node][i].Dest==a)
{
v[Node][i].Value+=minimum;
break;
}
}
}
}
//--------------------------------------
void afisare()
{
int i,j,s=0;
for (i=1; i<=n; i++)
for (j=0; j<v[i].size(); j++)
if (v[i][j].Dest==n)
s=s+v[i][j].Value;
fprintf(fout,"%d",s);
}
//--------------------------------------
int main()
{
citire();
visited[1]=1;
solve();
afisare();
fclose(fout);
return 0;
}