Cod sursa(job #271778)

Utilizator mihai0110Bivol Mihai mihai0110 Data 5 martie 2009 22:22:49
Problema Critice Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include<stdio.h>
#include<vector>
#define MAXN 1002
#define MAXM 10001

using namespace std;

int i,x,y,z,m,n;
int c[MAXN][MAXN],f[MAXN][MAXN];
int tata[MAXN];
int m1[MAXM],m2[MAXM];
int v1[MAXN],v2[MAXN];
int sol[MAXN];
vector <int> a[MAXN];

int bfs()
{
    int p,u,i,x,y,ok=0;
    int Q[MAXN];
    memset(tata,0,sizeof(tata));
    tata[1]=1;
    for(p=1,u=1,Q[p]=1;p<=u;p++)
    {
        x=Q[p];
        for(i=0;i<a[x].size();i++)
        {
            y=a[x][i];
            if((c[x][y]-f[x][y])>0 && !tata[y])
            {
                if(y==n)
                {
                    ok=1;
                    continue;
                }
                tata[y]=x;
                Q[++u]=y;
            }
        }
    }

    return ok;
}

void dfs(int x,int v[])
{
    int i;
    v[x]=1;
    for(i=0;i<a[x].size();i++)
        if(!v[a[x][i]] && (c[x][a[x][i]]-f[x][a[x][i]]) > 0)
            dfs(a[x][i],v);
}


int main(void)
{
    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,&z);
        m1[i]=x;
        m2[i]=y;
        c[x][y]=c[y][x]=z;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    int j;
    int fmin,flx=0;

    while(bfs())
    {
        for(i=0;i<a[n].size();i++)
            if(tata[a[n][i]])
            {
                y=a[n][i];
                fmin=c[y][n]-f[y][n];
                for(x=y;x!=1;x=tata[x])
                    if((c[tata[x]][x]-f[tata[x]][x]) < fmin)
                        fmin=c[tata[x]][x]-f[tata[x]][x];
                f[y][n]+=fmin;
                f[n][y]-=fmin;
                for(x=y;x!=1;x=tata[x])
                {
                    f[tata[x]][x]+=fmin;
                    f[x][tata[x]]-=fmin;
                }
                flx+=fmin;
            }
    }
    dfs(1,v1);
    dfs(n,v2);
    int nsol=0;
    for(i=1;i<=m;i++)
    {
        x=m1[i];y=m2[i];
        if((c[x][y]<=f[x][y] || c[y][x]<=f[y][x]) && ((v1[x] && v2[y]) || (v2[x] && v1[y])))
            sol[++nsol]=i;
    }
    printf("%d\n",nsol);
    for(i=1;i<=nsol;i++)
        printf("%d\n",sol[i]);
    return 0;
}