Pagini recente » Cod sursa (job #1442148) | Cod sursa (job #2137720) | Cod sursa (job #1137315) | Cod sursa (job #2941606) | Cod sursa (job #1205124)
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream f("maxflow.in");
ofstream o("maxflow.out");
const int inf = 1000000000;
vector <int> a[1107],b[1101];
int n,m, semn[1104],retea[1101][1101],flux[1101][1101],parc[1101],venit[1101],ok;
void df(int nod,int v);
void marc(int nod,int tata,int v){
if(semn[nod]){
flux[tata][nod]+=v;
}else flux[nod][tata]-=v;
if(tata==1){
for(int i=1;i<=n;i++)parc[i]=0;
ok=1;
df(1,inf);
}else marc(tata,venit[tata],v);
}
void df(int nod,int v){
if(nod==n){
marc(nod,venit[nod],v);
ok=0;
return;
}
parc[nod]=1;
for(int i=0;i<a[nod].size();i++)
if(parc[a[nod][i]]!=1 && flux[nod][a[nod][i]]<retea[nod][a[nod][i]] && ok){
venit[a[nod][i]]=nod;
semn[a[nod][i]]=1;
df(a[nod][i],min(v,retea[nod][a[nod][i]]-flux[nod][a[nod][i]]));
}
for(int i=0;i<b[nod].size();i++)
if(parc[b[nod][i]]!=1 && flux[b[nod][i]][nod]>0 && ok){
venit[b[nod][i]]=nod;
semn[b[nod][i]]=0;
df(b[nod][i],min(v,flux[b[nod][i]][nod]));
}
ok=0;
}
int main(){
f>>n>>m;
int x,y,z;
for(int i=1;i<=m;i++){
f>>x>>y>>z;
retea[x][y]=z;
a[x].push_back(y);
b[y].push_back(x);
}
ok=1;
df(1,inf);
int fl = 0;
for(int i=1;i<=n;i++)fl+=flux[1][i];
/* for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)o<<retea[i][j]<<" ";
o<<endl;
}
o<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)o<<flux[i][j]<<" ";
o<<endl;
}*/
o<<fl;
}