Cod sursa(job #2751237)

Utilizator Trifan_BogdanTrifan Bogdan Cristian Trifan_Bogdan Data 14 mai 2021 16:56:28
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>
#define inf 1000000;
using namespace std;
fstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,i,j,r,T[10006],x,y,S,D;
int F[10006][10006],c[10006][10006],flux;
bool a[10006][10006],grad_int[10006],grad_ext[10006];
queue <int> q;
void citire()
{
    f>>n>>m;
    for(int i=1;i<=m;i++)
    {
        f>>x>>y;
        a[x][y]=1;
        f>>c[x][y];

        grad_ext[x]=1;
        grad_int[y]=1;
    }
}

int sosire()
{
    for(int i=1;i<=n;i++)
        if(grad_int[i]==0)return i;
}
int plecare()
{
    for(int i=1;i<=n;i++)
        if(grad_ext[i]==0)return i;
}

int bfs(int S,int D)
{
int p,u,i,nod;
memset(T,0,sizeof(T));
while(!q.empty())q.pop();
q.push(S);T[S]=-1;
while(!q.empty())
{      nod=q.front();
      for(int i=1;i<=n;i++)
      {
          if(!T[i]&&c[nod][i]>F[nod][i])
          {
              q.push(i);T[i]=nod;
              if(i==D)return 1;
          }
      }
q.pop();
}

return 0;
}

int flux_max()
{

    int r,i;

    for(flux=0;bfs(S,D);flux+=r)
    {
        r=inf;
        i=D;
        while(i!=S)
        {
            r=min(r,c[T[i]][i]-F[T[i]][i]);
            i=T[i];
        }
        i=D;
        while(i!=S)
        {F[T[i]][i]+=r;
        F[i][T[i]]-=r;
        i=T[i];
        }
    }

}
int main()
{citire();
S=sosire();
D=plecare();

cout<<S<<" "<<D<<'\n';

flux_max();
g<<flux;
    return 0;
}