Cod sursa(job #2329085)

Utilizator NaritaandreiCNAINarita Andrei NaritaandreiCNAI Data 26 ianuarie 2019 12:39:00
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <stdio.h>
#include <vector>
using namespace std;
FILE *f,*g;
struct graf
{
    int node, next;
}v[10012];
int cost[1002][1002];
int start[1002], used[1002], coada[1002], t[1002];
int n,m,nr=1,flux;
void read()
{
    int x,y,c,k=0;
    fscanf(f,"%d %d",&n,&m);
    for(int i=1; i<=m; i++)
    {
        fscanf(f,"%d %d %d",&x,&y,&c);
        v[++k].node=y, v[k].next=start[x], start[x]=k;
        v[++k].node=x, v[k].next=start[y], start[y]=k;
        cost[x][y]=c;

    }
}
int manim(int a, int b)
{
    return a<b ? a:b;
}
bool bfs()
{
    int pi,ps,x;
    pi=ps=1;
    coada[pi]=1;
    while(ps<=pi)
    {
        x=coada[ps];
        for(int i=start[x]; i; i=v[i].next)
        {
            if(used[v[i].node]<nr && cost[x][v[i].node]>0)
            {
                used[v[i].node]=nr;
                t[v[i].node]=x;
                if(v[i].node!=n)
                    coada[++pi]=v[i].node;
            }
        }
        ps++;
    }
    if(used[n]==nr)
        return 1;
    return 0;
}
void fluxx()
{   int maxi;
    while(bfs())
    {
        for(int i=start[n]; i; i=v[i].next)
        {
            if(used[v[i].node]==nr && cost[v[i].node][n]>0)
            {
                t[n]=v[i].node;
                maxi=999999999;
                for(int j=n; j!=1; j=t[j])
                    maxi=manim(maxi,cost[t[j]][j]);
                for(int j=n; j!=1; j=t[j])
                {
                    cost[t[j]][j]-=maxi;
                    cost[j][t[j]]+=maxi;
                }
                flux+=maxi;
            }
        }
        nr++;
    }
}
void write()
{
    fprintf(g,"%d",flux);
}
int main()
{
    f=fopen("maxflow.in","r");
    g=fopen("maxflow.out","w");
    read();
    fluxx();
    write();
    fclose(f);
    fclose(g);
    return 0;
}