Cod sursa(job #286980)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 24 martie 2009 13:11:17
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <stdio.h>
#include <algorithm>
#define N 1001

using namespace std;

struct nod
{
     int inf,poz;
     nod *next;
}*sir[N];

int T[N],cp[N][N],F[N][N],coada[N],rez[N*10],viz[N*10];
int flux,n,m,cate;

void baga(int a,int b,int p)
{
     nod *q=new nod;
     q->inf=a;
     q->poz=p;
     q->next=sir[b];
     sir[b]=q;
}

void citire()
{
     int a,b,f;
     freopen ("critice.in","r",stdin);
     freopen ("critice.out","w",stdout);
     scanf ("%d %d",&n,&m);
     for (int i=1;i<=m;i++)
     {
          scanf ("%d %d %d",&a,&b,&f);
          cp[a][b]=f;
          cp[b][a]=f;
          baga(a,b,i);
          baga(b,a,i);
     }
}


int verif()
{
     int nr=0;
     for (int i=2;i<=n;i++)
          T[i]=0;
     T[1]=-1;
     coada[nr++]=1;
     for (int i=0;i<nr;i++)
     {
          for (nod *q=sir[coada[i]];q;q=q->next)
          {
               if (T[q->inf] || cp[coada[i]][q->inf]<=F[coada[i]][q->inf])
                    continue;
               T[q->inf]=coada[i];
               coada[nr++]=q->inf;
               if (q->inf==n)
                    return 1;
          }
     }
     return 0;
}

void solve()
{
     int fl;
     while (verif())
     {
          for (int i=1;i<=n;i++)
          {
               if (!T[i] || cp[i][n]<=F[i][n])
                    continue;
               fl=cp[i][n]-F[i][n];
               int nod=i;
               while (nod!=1)
               {
                    if (fl>cp[T[nod]][nod]-F[T[nod]][nod])
                         fl=cp[T[nod]][nod]-F[T[nod]][nod];
                    nod=T[nod];
               }
               if (!fl)
                    continue;
               F[i][n]+=fl;
               F[n][i]-=fl;
               nod=i;
               while (nod!=1)
               {
                    F[T[nod]][nod]+=fl;
                    F[nod][T[nod]]-=fl;
                    nod=T[nod];
               }
          }
     }
}

void sol(int X)
{
     int nr=0;
     for (int i=1;i<=n;i++)
          T[i]=0;
     T[X]=1;
     coada[nr++]=X;
     for (int i=0;i<nr;i++)
     {
          for (nod *q=sir[coada[i]];q;q=q->next)
          {
               if (T[q->inf])
                    continue;
               coada[nr++]=q->inf;
               if ((cp[coada[i]][q->inf]==F[coada[i]][q->inf]) || (viz[q->poz] && cp[q->inf][coada[i]]==F[q->inf][coada[i]] ))
               {
                    viz[q->poz]++;
                    if (viz[q->poz]==2)
                         rez[cate++]=q->poz;
               }
               else
                         T[q->inf]=coada[i];
          }
     }
}

int main ()
{
     citire();
     solve();
     sol(1);
     sol(n);
     sort(rez,rez+cate);
     printf("%d\n",cate);
     for (int i=0;i<cate;i++)
          printf("%d\n",rez[i]);
     return 0;
}