Cod sursa(job #477316)

Utilizator freak93Adrian Budau freak93 Data 14 august 2010 09:27:03
Problema Algola Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>
#include<cassert>

using namespace std;

const char iname[]="algola.in";
const char oname[]="algola.out";
const int maxn=2860;
const int inf=0x3f3f3f3f;

ifstream f(iname);
ofstream g(oname);

int C[maxn][maxn],F[maxn][maxn],flow,i,j,n,x,y,m,S=0,D=maxn-1,A[maxn],many,t;
vector<int> E[maxn];

bool bfs()
{
    memset(A,-1,sizeof(A));
    A[S]=0;
    queue<int> Q;
    Q.push(S);
    while(!Q.empty())
    {
        x=Q.front();
        Q.pop();
        if(x==D)
            break;
        for(vector<int>::iterator it=E[x].begin();it!=E[x].end();++it)
            if(A[*it]==-1&&C[x][*it]>F[x][*it])
                A[*it]=x,Q.push(*it);
    }
    return (A[D]!=-1);
}

int muchii[maxn][3];
int main()
{
    f>>n>>m;
    for(i=1;i<=n;++i)
        E[S].push_back(i),E[i].push_back(S),f>>C[S][i],many+=C[S][i];
    for(i=1;i<=m;++i)
        f>>muchii[i][0]>>muchii[i][1]>>muchii[i][2];
    E[1].push_back(D);
    E[D].push_back(1);
    C[1][D]=inf;
    assert(many<=50);
    do
    {
        for(;bfs();)
        {
            int mint=inf;
            for(i=D;i!=S;i=A[i])
                mint=min(mint,C[A[i]][i]-F[A[i]][i]);
            flow+=mint;
            for(i=D;i!=S;i=A[i])
                F[A[i]][i]+=mint,F[i][A[i]]-=mint;
        }
        for(i=n*t+1;i<=n*t+n;++i)
            C[i][i+n]=inf,E[i].push_back(i+n),E[i+n].push_back(i);
        for(i=1;i<=m;++i)
            C[muchii[i][0]+n*t][muchii[i][1]+n*t+n]=C[muchii[i][1]+n*t][muchii[i][0]+n*t+n]=muchii[i][2],
            E[muchii[i][0]+n*t].push_back(muchii[i][1]+n*t+n),E[muchii[i][1]+n*t+n].push_back(muchii[i][0]+n*t),
            E[muchii[i][1]+n*t].push_back(muchii[i][0]+n*t+n),E[muchii[i][0]+n*t+n].push_back(muchii[i][1]+n*t);
        ++t;
        C[n*t+1][D]=inf;
        E[n*t+1].push_back(D);
        assert(t<=n*many);
    }while(flow<many);
    g<<t-1<<"\n";
}