Pagini recente » Cod sursa (job #864497) | Cod sursa (job #2924763) | Cod sursa (job #2107126) | Cod sursa (job #3217572) | Cod sursa (job #2680747)
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#define ll long long
#define pb push_back
#define pf push_front
#define nmax 1000
#define inf 1000000000
using namespace std;
int n,m,dest,source,maxflow=0;
vector<int> adj[nmax+5];
int val[1005][1005],tata[1005];
class InParser {
private:
FILE *fin;
char *buff;
int sp;
char read_ch() {
++sp;
if (sp == 4096) {
sp = 0;
fread(buff, 1, 4096, fin);
}
return buff[sp];
}
public:
InParser(const char* nume) {
fin = fopen(nume, "r");
buff = new char[4096]();
sp = 4095;
}
InParser& operator >> (int &n) {
char c;
while (!isdigit(c = read_ch()) && c != '-');
int sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
InParser& operator >> (long long &n) {
char c;
n = 0;
while (!isdigit(c = read_ch()) && c != '-');
long long sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
};
bool bfs(int node)
{
vector<bool> d(n+2,0);
queue<int> q;
q.push(node);
d[node]=1;
tata[node]=-1;
while(!q.empty())
{
int node=q.front();
if(node==dest) return 1;
q.pop();
for(auto x:adj[node])
{
if(d[x]==0&&val[node][x]>0)
{
d[x]=1;
q.push(x);
tata[x]=node;
if(x==dest) return 1;
}
}
}
return 0;
}
int flow(int node,int cap)
{
if(cap==0) return 0;
while(node!=source)
{
if(val[tata[node]][node]<cap)
{
cap=val[tata[node]][node];
}
node=tata[node];
if(cap==0) return 0;
}
node=dest;
while(node!=source)
{
val[tata[node]][node]-=cap;
val[node][tata[node]]+=cap;
node=tata[node];
}
return cap;
}
int main()
{
InParser f("maxflow.in");
ofstream g("maxflow.out");
f>>n>>m;
dest=n;
source=1;
for(int i=1;i<=m;i++)
{
int x,y,c;
f>>x>>y>>c;
adj[x].pb(y);
adj[y].pb(x);
val[x][y]+=c;
}
while(bfs(source))
{
maxflow+=flow(dest,inf);
}
g<<maxflow;
}