Pagini recente » Cod sursa (job #2231469) | Cod sursa (job #2134065) | Cod sursa (job #1834193) | Cod sursa (job #1304962) | Cod sursa (job #2434275)
#include <fstream>
#include <vector>
#include <queue>
#define nmax 1010
#define inf 0x3f3f3f3f
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
class graf{
private:
vector<int> edges[nmax];
int viz[nmax]={0};
int nodes=0;
public:
int c[nmax][nmax]={0};
graf(int n){
nodes=n;
}
void addedge(int x,int y){
edges[x].push_back(y);
edges[y].push_back(x);
}
bool bfs(int x){
queue<int> q;
int nod;
q.push(x);
for (int i=2; i<=nodes; ++i)
viz[i]=-1;
while(!q.empty()){
nod=q.front();
q.pop();
for(int i=0;i<edges[nod].size();i++)
if(viz[edges[nod][i]]==-1 && c[nod][edges[nod][i]]>0){
if(edges[nod][i]!=nodes)
q.push(edges[nod][i]);
viz[edges[nod][i]]=nod;
}
}
return viz[nodes]!=-1;
}
void flowmax(){
int flow=0, i, nod, l=0;
while(bfs(1)){
for(i=0;i<edges[nodes].size();i++){
nod=edges[nodes][i];
if(viz[nod]==-1 || !c[nod][nodes])
continue;
viz[nodes]=nod;
int fmin=inf;
for (int i = nodes; viz[i]; i = viz[i]){
fmin=min(fmin,c[viz[i]][i]);
}
flow += fmin;
for (int i= nodes; viz[i]; i = viz[i])
{
c[viz[i]][i] -= fmin;
c[i][viz[i]] += fmin;
}
}
}
g<<flow;
}
};
int main(){
int m, n, x, y, z, i;
f>>n>>m;
graf graph(n);
for(i=1;i<=m;i++){
f>>x>>y>>z;
graph.addedge(x,y);
graph.c[x][y]+=z;
}
graph.flowmax();
}