Cod sursa(job #1119318)

Utilizator a96tudorAvram Tudor a96tudor Data 24 februarie 2014 16:55:42
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
#define INF 0x7fffffff
#define N_MAX 1010
#define pb push_back
using namespace std;
vector <int> list;
vector <int> G[N_MAX];
int T[N_MAX],C[N_MAX][N_MAX],F[N_MAX][N_MAX],N,Flux_Final=0;
inline int BFS(int D)
{
    int ok=0;
    queue <int> Q;
    memset(T,0,sizeof(T));
    Q.push(1); T[1]=-1;
    for (; !Q.empty();Q.pop())
    {
        int Nod=Q.front();
        for (vector <int> :: iterator it=G[Nod].begin();it!=G[Nod].end();++it)
        {
            int nod=*it;
            if (T[nod]==0 && C[Nod][nod]>F[Nod][nod])
            {
                    if (nod!=D) {T[nod]=Nod; Q.push(nod);}
                                else ok=1;
            }
        }
    }
    return ok;
}
inline void Solve(int N)
{
    for (int OK=BFS(N);OK;OK=BFS(N))
        for (vector<int> :: iterator it=list.begin();it!=list.end();++it)
        {
            int Nod=*it;
            if (T[Nod]>0 && C[Nod][N]>F[Nod][N])
            {
                T[N]=Nod;
                int MIN=INF;
                for (int nod=N;nod!=1;nod=T[nod])
                    MIN=min(MIN,C[T[nod]][nod]-F[T[nod]][nod]);
                if (MIN<=0) continue;
                Flux_Final+=MIN;
                for (int nod=N;nod!=1;nod=T[nod])
                    F[T[nod]][nod]+=MIN, F[nod][T[nod]]-=MIN;
            }
        }
}
inline void Load_Data(int &N)
{
    int M,x,y,c;
    scanf("%d%d",&N,&M);
    for (int i=1;i<=M;++i)
    {
         scanf("%d%d%d",&x,&y,&c); G[x].pb(y); C[x][y]=c; G[y].pb(x);
         if (y==N) list.pb(x);
    }
    memset(F,0,sizeof(F));
}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    Load_Data(N);
    Solve(N);
    printf("%d\n",Flux_Final);
    fclose(stdin); fclose(stdout);
    return 0;
}