Cod sursa(job #1519579)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 7 noiembrie 2015 15:50:42
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <fstream>
#include <vector>
#include <string.h>
#include <limits.h>
#include <algorithm>

#define NDIM 1003
#define MDIM 10003
#define INF INT_MAX
#define pb push_back
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int PAR[NDIM],F[NDIM][NDIM],POZ[NDIM][NDIM],C[NDIM][NDIM],Q[NDIM],SOL[10*NDIM],nr,N,M;
bool VIZ[NDIM];
vector <int> G[NDIM];
int BFS()
{
    memset(VIZ,0,sizeof(VIZ));
    Q[0]=Q[1]=VIZ[1]=1;
    int x,nod;
    for(int i=1;i<=Q[0];i++)
    {
        x=Q[i];
        if(x==N) continue;
        for(size_t j=0;j<G[x].size();j++)
        {
            nod=G[x][j];
            if(C[x][nod]==F[x][nod]||VIZ[nod]) continue;
            PAR[nod]=x;
            VIZ[nod]=1;
            Q[++Q[0]]=nod;
        }
    }
    return VIZ[N];
}
void BFS1()
{
    memset(VIZ,0,sizeof(VIZ));
    Q[0]=1;
    Q[1]=N;
    VIZ[N]=1;
    int x,nod;
    for(int i=1;i<=Q[0];i++)
    {
        x=Q[i];
        if(x==1) break;
        for(size_t j=0;j<G[x].size();j++)
        {
            nod=G[x][j];
            if(VIZ[nod]) continue;
            if(C[nod][x]==F[nod][x]||C[x][nod]==F[x][nod])
            {
                SOL[++nr]=POZ[nod][x];
            }
            else
            {
                VIZ[nod]=1;
                Q[++Q[0]]=nod;
            }
        }
    }

}
int main()
{
    int i,a,b,cost,nod,fmin,flow;
    fin>>N>>M;
    for(i=1;i<=M;i++)
    {
        fin>>a>>b>>cost;
        C[a][b]=C[b][a]=cost;
        POZ[a][b]=POZ[b][a]=i;
        G[a].pb(b);
        G[b].pb(a);
    }
    for(flow=0;BFS();)
    {
        for(size_t i=0;i<G[N].size();i++)
        {
            nod=G[N][i];
            fmin = INF;
            if(C[PAR[nod]][nod]==F[PAR[nod]][nod]||!VIZ[nod]) continue;
            PAR[N]=nod;
            for(nod=PAR[N];nod!=1;nod=PAR[nod])
                fmin=min(fmin,C[PAR[nod]][nod]-F[PAR[nod]][nod]);
            if(fmin==0) continue;
            for(nod=PAR[N];nod!=1;nod=PAR[nod])
            {
                F[PAR[nod]][nod]+=fmin;
                F[nod][PAR[nod]]-=fmin;
            }
            flow+=fmin;
        }
    }
    BFS1();
    sort(SOL+1,SOL+nr+1);
    fout<<nr<<'\n';
    for(i=1;i<=nr;i++)
        fout<<SOL[i]<<'\n';
    return 0;
}