Cod sursa(job #2778654)

Utilizator RobertAcAcatrinei Robert-Marian RobertAc Data 1 octombrie 2021 22:28:31
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
//ofstream out("maxflow.out");
//FILE *in=fopen("maxflow.in","r");
FILE *out=fopen("maxflow.out","w");
int muchii[1001][1001];
int16_t vecini[1001][1001];
int16_t marime[1001];
bool viz[1001];
int c=1<<16;
int n,m;
int x,y,z;
string line;
void getN(){
    getline(in,line);
    int ind=0;
    while(line[ind]!=' '){
        n=n*10+(line[ind++]-'0');
    }
    ind++;
    while(ind!=line.size()){
        m=m*10+(line[ind++]-'0');
    }
}
void getXYZ(){
    x=y=z=0;
    getline(in,line);
    int ind=0;
    while(line[ind]!=' '){
        x=x*10+(line[ind++]-'0');
    }
    ind++;
    while(line[ind]!=' '){
        y=y*10+(line[ind++]-'0');
    }
    ind++;
    while(ind!=line.size()){
        z=z*10+(line[ind++]-'0');
    }
}
int dfs(int nod,int minn){
    if(nod==n)return minn;
    viz[nod]=1;
    for(int j=0;j<marime[nod];j++){
        int i=vecini[nod][j];
        if(muchii[nod][i]>=c&&!viz[i]){
            int tmp=dfs(i,min(minn,muchii[nod][i]));
            if(tmp){
                muchii[nod][i]-=tmp;
                muchii[i][nod]+=tmp;
                return tmp;
            }
        }
    }
    return 0;
}
int main(){
    getN();
    for(int i=0;i<m;i++){
        getXYZ();
        vecini[x][marime[x]++]=y;
        vecini[y][marime[y]++]=x;
        muchii[x][y]=z;
    }
    int s=0;
    while(c){
        memset(viz+1,0,n+1);
        int tmp=dfs(1,1<<16);
        s+=tmp;
        if(!tmp){
            c>>=1;
        }
    }
    fprintf(out,"%d",s);
}