Cod sursa(job #1017239)

Utilizator george_stelianChichirim George george_stelian Data 27 octombrie 2013 16:06:49
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#define inf 1000000000

using namespace std;

struct muchie
{
    short int x;
    short int y;
};

vector<short int>v[1001];
char a[1001],sol[10000];
short int cc[1001],s[1001][1001],c[1001][1001],t[1001];
int n,m,lim,nr,i,j,nod1,nod,x,y,z,nr1;
muchie v1[10000];

int drum()
{
    for(i=1;i<=n;i++)a[i]=0;
    nr=0;
    cc[0]=1;
    a[1]=1;
    for(i=0;i<=nr;i++)
    {
        nod=cc[i];
        if(nod==n)continue;

        lim=v[nod].size();
        for(j=0;j<lim;j++)
        {
            nod1=v[nod][j];
            if(!a[nod1]&&c[nod][nod1]-s[nod][nod1])
            {
                a[nod1]=1;
                cc[++nr]=nod1;
                t[nod1]=nod;
            }
        }
    }
    if(a[n])return 1;
    else return 0;
}

int main()
{
    freopen("critice.in", "r", stdin);
    freopen("critice.out", "w", stdout);
    scanf("%d%d",&n,&m);
    for(i=0;i<m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        v[x].push_back(y);
        v[y].push_back(x);
        v1[i].x=x;
        v1[i].y=y;
        c[x][y]=z;
        c[y][x]=z;
    }
    while(drum())
    {
        lim=v[n].size();
        for(i=0;i<lim;i++)
        {
            nod=v[n][i];
            if(a[nod]&&c[nod][n]-s[nod][n])
            {
                t[n]=nod;
                x=inf;
                for(nod=n;nod!=1;nod=t[nod])
                {
                    x=min(x,c[t[nod]][nod]-s[t[nod]][nod]);
                }
                for(nod=n;nod!=1;nod=t[nod])
                {
                    s[t[nod]][nod]+=x;
                    s[nod][t[nod]]-=x;
                }
            }
        }
    }
    nr1=0;
    for(x=0;x<m;x++)
    if(s[v1[x].x][v1[x].y]==0 && s[v1[x].y][v1[x].x]==0)
    {
        c[v1[x].x][v1[x].y]++;
        c[v1[x].y][v1[x].x]++;
        if(drum())
        {
            sol[x]=1;
            nr1++;
        }
        c[v1[x].x][v1[x].y]--;
        c[v1[x].y][v1[x].x]--;
    }
    printf("%d\n",nr1);
    for(i=0;i<m;i++)
    {
        if(sol[i])printf("%d\n",i+1);
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}