Pagini recente » Borderou de evaluare (job #1666999) | Cod sursa (job #2268998) | Cod sursa (job #288235) | Cod sursa (job #1236738) | Cod sursa (job #702685)
Cod sursa(job #702685)
#include <fstream>
//#include <iostream>
#include <vector>
using namespace std;
ifstream k("maxflow.in");
ofstream g("maxflow.out");
const int nbmax=1001;
int n,m,x,y,c,ok=1;
vector<int> path,a[nbmax];
struct tpath {int flux,cap;} f[nbmax][nbmax];
int chk[nbmax];
int abs(int x){return (x>0?x:-x);}
int sgn(int x){return x/abs(x);}
int dfs(int x)
{
if(x==n) return 1;
chk[x]=ok;
int s=a[x].size();
for(int i=0;i<s;i++)
if(chk[abs(a[x][i])]!=ok and f[x][abs(a[x][i])].flux<f[x][abs(a[x][i])].cap)
if(dfs(abs(a[x][i]))==1)
{
path.push_back(a[x][i]);
return 1;
}
return 0;
}
int main()
{
k>>n>>m;
for(int i=1; i<=m; i++)
{
k>>x>>y>>c;
a[x].push_back(y);
a[y].push_back(-x);
f[x][y].cap=c;
}
while(dfs(1)==1)
{
path.push_back(1);
int s=path.size();
int minn=100001;
for(int i=s-2;i>=0;i--)
if(minn>f[path[i+1]][path[i]].cap-f[path[i+1]][path[i]].flux)
minn=f[path[i+1]][path[i]].cap-f[path[i+1]][path[i]].flux;
for(int i=s-2;i>=0;i--)
f[path[i+1]][path[i]].flux+=(minn*sgn(path[i+1]));
ok++;
path.resize(0);
}
int s=a[1].size();
int sol=0;
for(int i=0;i<s;i++)
sol+=f[1][a[1][i]].flux;
g<<sol;
k.close();
g.close();
return 0;
}