Cod sursa(job #1468117)

Utilizator horiainfoTurcuman Horia horiainfo Data 5 august 2015 11:39:28
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <fstream>
#include <cstdio>
#include <vector>
#include <memory.h>

#define NMAX 1002
#define INF 9999999999
using namespace std;

ofstream fout("critice.out");

int co[NMAX],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()
{
    int sf =1 , nod;
    co[1]=1;
    memset(viz,0,sizeof(viz));
    viz[1]=1;

    for(int inc = 1;inc<=sf;inc++)
    {
        nod = co[inc];
        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[++sf] = 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;
}