Cod sursa(job #1222516)

Utilizator acomAndrei Comaneci acom Data 23 august 2014 14:45:47
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define NMAX 10005
#define MMAX 100005
vector <int> r,v[NMAX];
queue <int> q;
pair <int,int> a[MMAX];
int n,m,x,y,c,minim,C[NMAX][NMAX],F[NMAX][NMAX],T[NMAX],U[NMAX];
int bfs()
{
    int i;
    memset(T,0,sizeof(T));
    T[1]=-1;
    q.push(1);
    while (!q.empty())
    {
        x=q.front(); q.pop();
        for (i=0;i<v[x].size();++i)
        {
            y=v[x][i];
            if (!T[y] && C[x][y]>F[x][y])
            {
                T[y]=x;
                q.push(y);
            }
        }
    }
    return T[n];
}
void bfs1()
{
    int i;
    U[n]=-1;
    q.push(n);
    while (!q.empty())
    {
        x=q.front(); q.pop();
        for (i=0;i<v[x].size();++i)
        {
            y=v[x][i];
            if (!U[y] && C[x][y]>-F[x][y])
            {
                U[y]=x;
                q.push(y);
            }
        }
    }
}
int main()
{
    int i;
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        a[i]=make_pair(x,y);
        v[x].push_back(y);
        v[y].push_back(x);
        C[x][y]=C[y][x]=c;
    }
    while (bfs())
    {
        for (i=0;i<v[n].size();++i)
        {
            x=v[n][i];
            if (T[x])
            {
                minim=C[x][n]-F[x][n];
                y=x;
                while (T[y]!=-1)
                {
                    minim=min(minim,C[T[y]][y]-F[T[y]][y]);
                    y=T[y];
                }
                y=x;
                F[x][n]+=minim, F[n][x]-=minim;
                while (T[y]!=-1)
                {
                    F[T[y]][y]+=minim, F[y][T[y]]-=minim;
                    y=T[y];
                }
            }
        }
    }
    bfs();
    bfs1();
    for (i=1;i<=m;++i)
        if ( (T[a[i].first] && U[a[i].second]) || (U[a[i].first] && T[a[i].second]) )
            r.push_back(i);
    printf("%d\n",r.size());
    for (i=0;i<r.size();++i)
        printf("%d\n",r[i]);
    return 0;
}