Cod sursa(job #318561)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 28 mai 2009 18:21:37
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <stdio.h>
#include <algorithm>
#include <string.h>

using namespace std;

#define maxn 2010

long n, i, m, j, k, a, b, x, l, r, ok, nod, size, y;
long c[maxn][maxn], nrm[maxn][maxn], up[maxn], f[maxn], coa[maxn], coa1[maxn], coa2[maxn], sol[maxn];

long min(long a, long b)
{
    if(a>b) return b;
    return a;
}

int main()
{
    freopen("critice.in", "r", stdin);
    freopen("critice.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            c[i][j]=-1;
        }
    }            
    for(i=1; i<=m; i++)
    {
        scanf("%d %d %d", &a, &b, &x);
        c[a][b]=x;
        c[b][a]=x;
        nrm[a][b]=i;
        nrm[b][a]=i;
    }
    ok=1;
    while(ok)
    {
        for(i=1; i<=n; i++)
        {
            f[i]=0;
            up[i]=-1;
        }
        f[1]=111100;
        coa[1]=1;
        for(l=1, r=1; l<=r; l++)
        {
            nod=coa[l];
            for(i=1; i<=n; i++)
            {
                if(f[i]==0 && c[nod][i]>0)
                {
                    f[i]=min(f[nod], c[nod][i]);
                    up[i]=nod;
                    r++;
                    coa[r]=i;
                }
            }
            if(f[n]>0) break;
        }
        nod=n;
        if(f[n]>0)
        {
            ok=1;
            while(up[nod]!=-1)
            {
                i=up[nod];
                c[nod][i]+=f[n];
                c[i][nod]-=f[n];
                nod=up[nod];
            }
        }        
        else ok=0;
    }
    coa1[1]=1;
    f[1]=1;
    memset(f, 0, sizeof(f));
    for(l=1, r=1; l<=r; l++)
    {
        nod=coa1[l];
        for(i=1; i<=n; i++)
        {
            if(nrm[nod][i]>0 && c[nod][i]>0 && f[i]==0)
            {
                r++;
                coa1[r]=i;
                f[i]=1;
            }
        }
    }
    coa1[0]=r;
    coa2[1]=n;
    memset(f, 0, sizeof(f));
    f[n]=1;
    for(l=1, r=1; l<=r; l++)
    {
        nod=coa2[l];
        for(i=1; i<=n; i++)
        {
            if(nrm[i][nod]>0 && c[i][nod]>0 && f[i]==0)
            {
                r++;
                coa2[r]=i;
                f[i]=1;
            }
        }
    }
    coa2[0]=r;
    sol[0]=0;
    for(i=1; i<=coa1[0]; i++)
    {
        for(j=1; j<=coa2[0]; j++)
        {
            x=coa1[i];
            y=coa2[j];
            if(nrm[x][y]>0 && (c[x][y]>0 || c[y][x]>0))
            {
                sol[0]++;
                sol[sol[0]]=nrm[x][y];
            }
        }
    }
    size=sol[0];
 //   sort(sol+1, sol+size+1);
    printf("%d\n", sol[0]);
    for(i=1; i<=sol[0]; i++)
    {
        printf("%d\n", sol[i]);
    }               
    return 0;
}