Pagini recente » Cod sursa (job #1832379) | Cod sursa (job #1341269) | Cod sursa (job #236857) | Cod sursa (job #892458) | Cod sursa (job #428836)
Cod sursa(job #428836)
#include<fstream>
#include<vector>
#include<queue>
#define MAX 100000
#define maxn 510
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
vector < pair<int,int> > v[maxn];
vector < pair<int,int> >::iterator it;
queue <int> q;
int n,m,S,T,flow,minim,drum;
int c[maxn][maxn],f[maxn][maxn],d[maxn],t[maxn],pus[maxn];
int bellmanford()
{ int i,nod;
for(i=1;i<=n;i++)
{ d[i]=MAX;
t[i]=-1;
pus[i]=0;
}
d[S]=0;
q.push(S);
pus[S]=1;
while(!q.empty())
{ nod=q.front();
for(it=v[nod].begin();it!=v[nod].end();it++)
if(d[it->first]>d[nod]+it->second&&c[nod][it->first]-f[nod][it->first]>0)
{ d[it->first]=d[nod]+it->second;
t[it->first]=nod;
if(pus[it->first]==0)
{ q.push(it->first);
pus[it->first]=1;
}
}
pus[nod]=0;
q.pop();
}
if(d[T]!=MAX)
{ minim=MAX;
drum=1;
i=T;
while(i!=S)
{ minim=min(minim,c[t[i]][i]-f[t[i]][i]);
i=t[i];
}
i=T;
while(i!=S)
{ f[t[i]][i]+=minim;
f[i][t[i]]-=minim;
i=t[i];
}
return minim*d[T];
}
return 0;
}
void flux()
{ drum=1;
while(drum)
{ drum=0;
flow+=bellmanford();
}
}
int main()
{ int i,x,y,z,cc;
fin>>n>>m>>S>>T;
for(i=1;i<=m;i++)
{ fin>>x>>y>>cc>>z;
c[x][y]=cc;
v[x].push_back(make_pair(y,z));
v[y].push_back(make_pair(x,-z));
}
flux();
fout<<flow;
fin.close();
fout.close();
return 0;
}