Cod sursa(job #1454469)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 26 iunie 2015 17:29:03
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>
#include <vector>
#include <queue>
#define Nmax 305
#define INF 2000000000
#define Nrmax 5055
#define pb push_back

using namespace std;

int Nr[Nmax],x[Nmax],y[Nmax],l[Nmax],n,m,S,D,timp,tata[Nrmax];
int Cap[Nrmax][Nrmax],F[Nrmax][Nrmax];
vector <int> L[Nrmax];
queue <int> Q;

inline void addEdge(int x, int y, int C)
{
    L[x].pb(y); L[y].pb(x);
    Cap[x][y]=C; Cap[y][x]=0;
}

inline int Cod(int x, int y)
{
    return y*n+x;
}

inline bool Bfs()
{
    int i;
    while(!Q.empty()) Q.pop();
    for(i=S;i<=Cod(n,timp);++i) tata[i]=-1;
    Q.push(S); tata[S]=0;
    while(!Q.empty())
    {
        int nod=Q.front(); Q.pop();
        if(nod==D) return true;
        for(auto it : L[nod])
        {
            if(tata[it]!=-1 || F[nod][it]==Cap[nod][it]) continue;
            tata[it]=nod; Q.push(it);
        }
    }
    return false;
}

int main()
{
    int i,total=0,flow=0;
    ifstream cin ("algola.in");
    ofstream cout ("algola.out");
    cin>>n>>m;
    for(i=1;i<=n;++i) cin>>Nr[i];
    for(i=1;i<=m;++i) cin>>x[i]>>y[i]>>l[i];
    for(i=1;i<=n;++i)
        if(Nr[i])
        {
            addEdge(0,Cod(i,0),Nr[i]);
            total+=Nr[i];
        }
    for(timp=0;timp<=100;++timp)
    {
        if(timp)
        {
            for(i=1;i<=n;++i) addEdge(Cod(i,timp-1),Cod(i,timp),200);
            for(i=1;i<=m;++i)
            {
                addEdge(Cod(x[i],timp-1),Cod(y[i],timp),l[i]);
                addEdge(Cod(y[i],timp-1),Cod(x[i],timp),l[i]);
            }
        }
        D=Cod(1,timp);
        while(Bfs())
        {
            int minflow=200;
            for(int i=D;i!=S;i=tata[i]) minflow=min(minflow,Cap[tata[i]][i]-F[tata[i]][i]);
            for(int i=D;i!=S;i=tata[i])
            {
                F[tata[i]][i]+=minflow;
                F[i][tata[i]]-=minflow;
            }
            flow+=minflow;
        }
        if(flow==total)
        {
            cout<<timp<<"\n"; return 0;
        }
    }
    return 0;
}