Cod sursa(job #1468124)

Utilizator horiainfoTurcuman Horia horiainfo Data 5 august 2015 11:51:37
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <fstream>
#include <cstdio>
#include <vector>
#include <memory.h>
#include <queue>

#define NMAX 1002
#define INF 0x3f3f3f3f
using namespace std;

ofstream fout("critice.out");

int ANT[NMAX],C[NMAX][NMAX],F[NMAX][NMAX],sol[NMAX];
bool viz[NMAX];
int n,m,nrNod;
struct drum{int nod1,nod2,limit;} muchie[10003];
vector<int> G[NMAX];

void read()
{
    freopen("critice.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&muchie[i].nod1,&muchie[i].nod2,&muchie[i].limit);

        G[muchie[i].nod1].push_back(muchie[i].nod2);
        G[muchie[i].nod2].push_back(muchie[i].nod1);

        C[muchie[i].nod1][muchie[i].nod2] = muchie[i].limit;
        C[muchie[i].nod2][muchie[i].nod1] = muchie[i].limit;
    }
}

bool BFS()
{
    queue<int> co;
    int nod;
    co.push(1);
    memset(viz,0,sizeof(viz));
    viz[1]=1;

    while(!co.empty())
    {
        nod = co.front();
        co.pop();
        if(nod == n)
            return 1;

        for(int i=0;i<G[nod].size();i++)
        {
            if(viz[G[nod][i]] || C[nod][G[nod][i]] == F[nod][G[nod][i]]) continue;

            viz[G[nod][i]] = 1;
            ANT[G[nod][i]] = nod;
            co.push(G[nod][i]);
        }
    }
    return 0;

}

void createFlux()
{
    int nod, flux;
    while(BFS())
        for(int i=0;i<G[n].size();i++)
        {
            nod = G[n][i];
            if(!viz[nod] || C[nod][n] == F[nod][n]) continue;
            ANT[n]= nod;

            flux = INF;
            for(int i=n;i>1;i = ANT[i])
                flux = min(flux, C[ANT[i]][i] - F[ANT[i]][i]);
            if(flux == 0) continue;

            for(int i=n;i>1;i=ANT[i])
                F[ANT[i]][i] = F[i][ANT[i]] = F[ANT[i]][i] + flux;
        }
}

void solve()
{
    for(int i=1;i<=m;i++)
    {
        if(C[muchie[i].nod1][muchie[i].nod2] == F[muchie[i].nod1][muchie[i].nod2])
        {
            C[muchie[i].nod1][muchie[i].nod2] = C[muchie[i].nod2][muchie[i].nod1] = muchie[i].limit + 1;
            if(BFS())
                sol[++nrNod] = i;
            C[muchie[i].nod1][muchie[i].nod2] = C[muchie[i].nod2][muchie[i].nod1] = muchie[i].limit;
        }
    }
}

void afis()
{
    fout<<nrNod<<'\n';
    for(int i=1;i<=nrNod;i++)
        fout<<sol[i]<<'\n';
}

int main()
{
    read();
    createFlux();
    solve();
    afis();

    return 0;
}