Cod sursa(job #1003913)

Utilizator misinoonisim necula misino Data 1 octombrie 2013 19:26:06
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#define N 5005
#define INF 999999999
using namespace std;
ifstream f("algola.in");
ofstream g("algola.out");
int i,x,y,n,m,timp,sursa,dest,sol,co,sumat,fluxt,mini,viz[N],c[N][N],flux[N][N],t[N];
queue<int>q;
vector<int>v1[N];
vector<pair<int,int> >v[N];
inline int bellman_ford()
{
    memset(viz,0,sizeof(viz));
    q.push(sursa);
    viz[sursa]=1;
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        if(x==dest)
        continue;
        for(vector<int>::iterator it=v1[x].begin();it!=v1[x].end();++it)
        if(!viz[*it]&&c[x][*it]>flux[x][*it])
        {
            viz[*it]=1;
            q.push(*it);
            t[*it]=x;
        }
    }
    return viz[dest];
}
int main()
{
    f>>n>>m;
    sursa=0;
    dest=n+1;
    for(i=1;i<=n;++i)
    {
        f>>x;
        sumat+=x;
        v1[sursa].push_back(i);
        v1[i].push_back(sursa);
        c[sursa][i]=x;
    }
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>co;
        v[x].push_back(make_pair(y,co));
        v[y].push_back(make_pair(x,co));
    }
    sol=1;
    while(fluxt<sumat)
    {
        for(i=1;i<=n;++i)
        {
            x=n*(sol-1)+i;
            v1[x].push_back(x+n);
            v1[x+n].push_back(x);
            c[x][x+n]=INF;
            for(vector<pair<int,int> >::iterator it=v[i].begin();it!=v[i].end();++it)
            {
                y=n*sol+it->first;
                v1[x].push_back(y);
                v1[y].push_back(x);
                c[x][y]=it->second;
            }
        }
        dest=sol*n+1;
        while(bellman_ford())
        {
            for(vector<int >::iterator it=v1[dest].begin();it!=v1[dest].end();++it)
            if(viz[*it]&&flux[*it][dest]<c[*it][dest])
            {
                mini=INF;
                t[dest]=*it;
                x=dest;
                while(x)
                {
                    mini=min(mini,c[t[x]][x]-flux[t[x]][x]);
                    x=t[x];
                }
                x=dest;
                while(x)
                {
                    flux[t[x]][x]+=mini;
                    flux[x][t[x]]-=mini;
                    x=t[x];
                }
                fluxt+=mini;
            }
        }
        ++sol;
    }
    g<<sol-1<<'\n';
    return 0;
}