Cod sursa(job #1520050)

Utilizator madalomarMadalomar madalomar Data 8 noiembrie 2015 11:25:57
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <fstream>
#include <vector>
#include <string.h>
#include <limits.h>

#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],C[NDIM][NDIM],Q[NDIM],SOL[MDIM],nr,N,M,vx[MDIM],vy[MDIM],p,u;
int i,a,b,cost,nod,fmin,flow,x,y;
bool VIZ[NDIM],VIZN[NDIM];
vector <int> G[NDIM];
int BFS()
{
    memset(VIZ,0,sizeof(VIZ));
    memset(PAR,0,sizeof(PAR));
    p=u=1;
    Q[1]=VIZ[1]=1;
    int x,nod;
    while(p<=u)
    {
        x=Q[p];
        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[++u]=nod;
        }
        p++;
    }
    return VIZ[N];
}
void BFSN()
{
    Q[1]=N;
    VIZN[N]=1;
    p=u=1;
    int x,nod;
    while(p<=u)
    {
        x=Q[p];
        for(size_t j=0;j<G[x].size();j++)
        {
            nod=G[x][j];
            if(VIZN[nod]==0 && C[nod][x]>F[nod][x] )
            {
                VIZN[nod]=1;
                Q[++u]=nod;
            }
        }
        p++;
    }
}

int main()
{
    fin>>N>>M;
    for(i=1;i<=M;i++)
    {
        fin>>a>>b>>cost;
        C[a][b]=C[b][a]=cost;
        G[a].pb(b);
        G[b].pb(a);
        vx[i]=a;
        vy[i]=b;
    }
    for(flow=0;BFS();)
    {
        for(i=0;i<G[N].size();i++)
        {
            nod=G[N][i];
            fmin = INF;
            if(C[nod][N]==F[nod][N]||!VIZ[nod]) continue;
            PAR[N]=nod;
            fmin=C[nod][N]-F[nod][N];
            if(fmin==0) continue;
            for(;nod!=1;nod=PAR[nod])
                fmin=min(fmin,C[PAR[nod]][nod]-F[PAR[nod]][nod]);

            for(nod=N;nod!=1;nod=PAR[nod])
            {
                F[PAR[nod]][nod]+=fmin;
                F[nod][PAR[nod]]-=fmin;
            }
            flow+=fmin;
        }
    }
    BFSN();
    for(i=1;i<=M;i++)
    {
        x=vx[i];y=vy[i];
        if(C[x][y]==F[x][y] || C[y][x]==F[y][x])
        {
            if((VIZN[x]==1 && VIZ[y]==1)||(VIZN[y]==1 && VIZ[x]==1))
            {
                SOL[++nr]=i;
            }
        }
    }
    fout<<nr<<'\n';
    for(i=1;i<=nr;i++)
        fout<<SOL[i]<<'\n';
    return 0;
}