Pagini recente » Cod sursa (job #575055) | Cod sursa (job #2809544) | Cod sursa (job #2849466) | Cod sursa (job #603368) | Cod sursa (job #2751237)
#include <bits/stdc++.h>
#define inf 1000000;
using namespace std;
fstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,i,j,r,T[10006],x,y,S,D;
int F[10006][10006],c[10006][10006],flux;
bool a[10006][10006],grad_int[10006],grad_ext[10006];
queue <int> q;
void citire()
{
f>>n>>m;
for(int i=1;i<=m;i++)
{
f>>x>>y;
a[x][y]=1;
f>>c[x][y];
grad_ext[x]=1;
grad_int[y]=1;
}
}
int sosire()
{
for(int i=1;i<=n;i++)
if(grad_int[i]==0)return i;
}
int plecare()
{
for(int i=1;i<=n;i++)
if(grad_ext[i]==0)return i;
}
int bfs(int S,int D)
{
int p,u,i,nod;
memset(T,0,sizeof(T));
while(!q.empty())q.pop();
q.push(S);T[S]=-1;
while(!q.empty())
{ nod=q.front();
for(int i=1;i<=n;i++)
{
if(!T[i]&&c[nod][i]>F[nod][i])
{
q.push(i);T[i]=nod;
if(i==D)return 1;
}
}
q.pop();
}
return 0;
}
int flux_max()
{
int r,i;
for(flux=0;bfs(S,D);flux+=r)
{
r=inf;
i=D;
while(i!=S)
{
r=min(r,c[T[i]][i]-F[T[i]][i]);
i=T[i];
}
i=D;
while(i!=S)
{F[T[i]][i]+=r;
F[i][T[i]]-=r;
i=T[i];
}
}
}
int main()
{citire();
S=sosire();
D=plecare();
cout<<S<<" "<<D<<'\n';
flux_max();
g<<flux;
return 0;
}