Cod sursa(job #1213299)

Utilizator thewildnathNathan Wildenberg thewildnath Data 27 iulie 2014 19:17:17
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;

#define NMAX 1002
#define INF 200000000

int n,m,tnr;
int t[NMAX],f[NMAX][NMAX],cap[NMAX][NMAX],ind[NMAX][NMAX],q[NMAX],nr[NMAX],tata[NMAX],fv[10002];

vector<int>v[NMAX];
vector<int>sol;

bool drum()
{
    int i,st=1,dr=0,nod=1,fiu;

    memset(t,0,sizeof(t));

    tnr=0;
    t[nod]=nod;
    q[++dr]=nod;

    while(st<=dr)
    {
        nod=q[st];
        ++st;

        for(i=0;i<v[nod].size();++i)
        {
            fiu=v[nod][i];

            if(f[nod][fiu]<cap[nod][fiu] && !t[fiu])
            {
                t[fiu]=nod;

                if(fiu==n)
                    tata[++tnr]=nod,t[fiu]=0;

                q[++dr]=fiu;
            }
        }
    }
    return tnr;
}

bool bfs(int nod,int c)
{
    int i,st=1,dr=0,fiu;

    memset(t,0,sizeof(t));

    t[nod]=nod;
    nr[nod]=c;
    q[++dr]=nod;

    while(st<=dr)
    {
        nod=q[st];
        ++st;

        for(i=0;i<v[nod].size();++i)
        {
            fiu=v[nod][i];

            if(f[nod][fiu]*c<cap[nod][fiu] && !t[fiu])
            {
                t[fiu]=nod;
                nr[fiu]=c;

                if(fiu==n)
                    return 1;

                q[++dr]=fiu;
            }
        }
    }
    return 0;
}

int main()
{
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    int i,j,x,y,c,minc;

    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&c);

        v[x].push_back(y);
        v[y].push_back(x);

        ind[x][y]=ind[y][x]=i;
        cap[x][y]=cap[y][x]=c;
    }

    while(drum())
    {
        for(j=1;j<=tnr;++j)
        {
            t[n]=tata[j];
            minc=INF;

            for(i=n;i!=1;i=t[i])
                if(cap[t[i]][i]-f[t[i]][i]<minc)
                    minc=cap[t[i]][i]-f[t[i]][i];

            for(i=n;i!=1;i=t[i])
            {
                f[t[i]][i]+=minc;
                f[i][t[i]]-=minc;
            }
        }
    }

    bfs(1,1);
    bfs(n,-1);

    for(i=1;i<=n;++i)
        for(j=0;j<v[i].size();++j)
        {
            x=ind[i][v[i][j]];

            if(!fv[x])
            {
                fv[x]=1;
                if(nr[i]*nr[v[i][j]]==-1)
                    sol.push_back(x);
            }
        }

    printf("%d\n",sol.size());
    for(i=0;i<sol.size();++i)
        printf("%d\n",sol[i]);

    return 0;
}