Cod sursa(job #938355)

Utilizator sleepaholicNeculaescu Theodor sleepaholic Data 12 aprilie 2013 14:07:01
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.18 kb
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 1005
#define mmax 10005
#define inf 100000
struct muchie{long x, y;};
long n, m, a, b, c, ne, vz[nmax], co[nmax], inc, sf, i, nf, el, t[nmax], vt[nmax], nod, fmin, fluxt, poz, aux, rez[mmax], nrez;
long cap[nmax][nmax], flux[nmax][nmax];
bool aj[5][nmax];
vector <long> ma[nmax];
vector <long> ::iterator it;
muchie v[mmax];


void citire()
{
    scanf("%ld %ld",&n,&m);
    for (i=1;i<=m;i++)
    {
        scanf("%ld %ld %ld",&a,&b,&c);
        ma[a].push_back(b);
        ma[b].push_back(a);
        cap[a][b]=cap[b][a]=c;
        v[i].x=a;   v[i].y=b;
    }
}

void bfs()
{
    co[1]=inc=sf=1; vz[1]=nf;   ne=0;
    while (inc<=sf)
    {
        el=co[inc];  inc++;
        if (el==n)
            break;
        for (it=ma[el].begin();it!=ma[el].end();it++)
            if (flux[el][*it]<cap[el][*it])
            {
                if (vz[*it]<nf)
                {
                    co[++sf]=*it;   vz[*it]=nf;
                    t[*it]=el;
                }
                if ((*it)==n)
                    vt[++ne]=el;
            }
    }

}

void calculare()
{
    while (1)
    {
        nf++;   bfs();
        if (vz[n]==nf)
            for (i=1;i<=ne;i++)
            {
                t[n]=vt[i];
                nod=n;  fmin=inf;
                while (nod>1)
                {
                    if (fmin>cap[t[nod]][nod]-flux[t[nod]][nod])
                        fmin=cap[t[nod]][nod]-flux[t[nod]][nod];
                    nod=t[nod];
                    if (fmin==0)
                        break;
                }
                nod=n;  fluxt+=fmin;
                if (fmin>0)
                    while (nod>1)
                    {
                        flux[t[nod]][nod]+=fmin;
                        flux[nod][t[nod]]-=fmin;
                        nod=t[nod];
                    }
            }
        else
            break;
    }
}

void dfs(long nod)
{
    vector <long> ::iterator it;
    vz[nod]=nf;    aj[poz][nod]=1;
    for (it=ma[nod].begin();it!=ma[nod].end();it++)
        if (vz[*it]<nf)
        {
            if (poz==1)
                if ((flux[nod][*it]<cap[nod][*it])&&(flux[nod][*it]>=0))
                    dfs(*it);
            if (poz==2)
                if ((flux[*it][nod]<cap[*it][nod]) && (flux[*it][nod]>=0))
                    dfs(*it);
        }
}

void rezolvare()
{
    nf++;   poz=1;
    dfs(1);
    nf++;   poz=2;
    dfs(n);
    for (i=1;i<=m;i++)
    {
            if ((aj[1][v[i].x])&&(aj[2][v[i].y])&&(cap[v[i].x][v[i].y]==flux[v[i].x][v[i].y]))
                rez[++nrez]=i;
            else
            {
                aux=v[i].x; v[i].x=v[i].y;  v[i].y=aux;
                if ((aj[1][v[i].x])&&(aj[2][v[i].y])&&(cap[v[i].x][v[i].y]==flux[v[i].x][v[i].y]))
                    rez[++nrez]=i;
            }
    }
    printf("%ld\n",nrez);
    for(i=1;i<=nrez;i++)
        printf("%ld\n",rez[i]);
}

int main()
{
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    citire();
    calculare();
    rezolvare();
  //  printf("%ld",fluxt);
    return 0;
}