Pagini recente » Cod sursa (job #453697) | Cod sursa (job #2221484) | Cod sursa (job #1159010) | Cod sursa (job #1072132) | Cod sursa (job #785679)
Cod sursa(job #785679)
#include<iostream>
#include<fstream>
#include<vector>
#include<bitset>
#include<string.h>
using namespace std;
struct coada {
int sursa,y;
};
coada c[1001];
vector < pair <int,int> > v[1001];
vector <int> path;
int viz[1001];
int bfs(int nod, int s)
{
int st,dr;
coada x;
st=1;
dr=1;
c[st].sursa=nod;
c[st].y=nod;
viz[nod]=1;
while(st<=dr) {
x=c[st];
st++;
for(vector < pair <int,int> > :: iterator it=v[x.y].begin();it!=v[x.y].end();it++)
if(viz[it->first]==0 && it->second) {
viz[it->first]=1;
dr++;
c[dr].sursa=x.y;
c[dr].y=it->first;
if(it->first==s)
return dr;
}
}
return 0;
}
int main ()
{
int n,m,i,x,y,capacity,fluxmax,flux,nr,sursa;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
f>>n>>m;
for(i=1;i<=m;i++) {
f>>x>>y>>capacity;
v[x].push_back(make_pair(y,capacity));
}
f.close();
fluxmax=0;
while(1) {;
memset(viz,0,sizeof(viz));
nr=bfs(1,n);
if(nr==0)
break;
sursa=c[nr].sursa;
path.clear();
path.push_back(n);
nr--;
while(nr>1) {
if(c[nr].y==sursa) {
path.push_back(sursa);
sursa=c[nr].sursa;
}
nr--;
}
flux=(1<<30);
sursa=1;
for(vector <int> :: iterator it=path.end()-1;it!=path.begin();it--) {
x=*it;
for(vector < pair <int,int> > :: iterator itt=v[sursa].begin();itt!=v[sursa].end();itt++)
if(itt->first==x && itt->second) {
if(itt->second<flux)
flux=itt->second;
break;
}
sursa=x;
}
x=*(path.begin());
for(vector < pair <int,int> > :: iterator itt=v[sursa].begin();itt!=v[sursa].end();itt++)
if(itt->first==x && itt->second) {
if(itt->second<flux)
flux=itt->second;
break;
}
sursa=1;
for(vector <int> :: iterator it=path.end()-1;it!=path.begin();it--) {
x=*it;
for(vector < pair <int,int> > :: iterator itt=v[sursa].begin();itt!=v[sursa].end();itt++)
if(itt->first==x && itt->second) {
itt->second=itt->second-flux;
break;
}
sursa=x;
}
x=*(path.begin());
for(vector < pair <int,int> > :: iterator itt=v[sursa].begin();itt!=v[sursa].end();itt++)
if(itt->first==x && itt->second) {
itt->second=itt->second-flux;
break;
}
sursa=x;
fluxmax=fluxmax+flux;
}
g<<fluxmax;
g.close();
return 0;
}