Cod sursa(job #40222)

Utilizator vlad_popaVlad Popa vlad_popa Data 27 martie 2007 12:02:01
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.33 kb
using namespace std;

#include <cstdio>
#include <cassert>
#include <string>

#define FIN "critice.in"
#define FOUT "critice.out"
#define NMAX 1001
#define MMAX 10001
#define INF 0x3f3f3f3f

int c[NMAX][NMAX], N, M, f[NMAX][NMAX], vizs[NMAX], vizt[NMAX];
int pred[NMAX], rez[MMAX], cd[NMAX], begin, ended;
int retn1[MMAX], retn2[MMAX], *lv[NMAX], gr[NMAX];

int bf ()
{
  int v, ii;
  
  memset (pred, 0, sizeof (pred));
  
  pred[1] = -1;
  begin  = ended = 0;
  cd[ended++] = 1;
  
  while (begin != ended)
   {
     v = cd[begin++];
     assert (v >= 1 && v <= N);
     for (int i = 1; i <= lv[v][0]; ++ i)
      {
        ii = lv[v][i];
        if (c[v][ii] - f[v][ii] > 0 && !pred[ii])
         {
           pred[ii] = v;
           cd[ended++] = ii;
           
           if (ii == N)
            return 1;
         }
      }
   }
  return 0;
}

int MIN (int x, int y)
{
  return x < y ? x : y;
}

void ford_fulk ()
{
  int i, min;
  
  while (bf ())
   {
     min = INF;
     
     for (i = N; pred[i] != -1; i = pred[i])
       min = MIN (min, c[pred[i]][i] - f[pred[i]][i]);
         
     for (i = N; pred[i] != -1; i = pred[i])
      {
        f[pred[i]][i] += min;
        f[i][pred[i]] -= min;
      }
   }
}

void bfs ()
{
  int v, ii;

  memset (pred, 0, sizeof (pred));
  
  pred[1] = -1;
  vizs[1] = true;
  begin = ended = 0;
  cd[ended++] = 1;
  
  while (begin != ended)
   {
     v = cd[begin++];
     //fprintf (stderr, "%d ", v);
     assert (v >= 1 && v <= N);
     for (int i = 1; i <= lv[v][0]; ++ i)
      {
        ii = lv[v][i];
        if (c[v][ii] - f[v][ii] > 0 && -f[v][ii] != c[v][ii] && !pred[ii])
         {
           pred[ii] = v;
           vizs[ii] = true;
           cd[ended++] = ii;
         }
      }
   }
}

void bft ()
{
  int v, ii;

  memset (pred, 0, sizeof (pred));
  
  pred[N] = -1;
  vizt[N] = true;
  begin = ended = 0;
  cd[ended++] = N;
  
  while (begin != ended)
   {
     v = cd[begin++];
     //fprintf (stderr, "%d ", v);
     assert (v >= 1 && v <= N);
     for (int i = 1; i <= lv[v][0]; ++ i)
      {
        ii = lv[v][i];
        if (c[v][ii] - f[v][ii] > 0 && -f[v][ii] != c[v][ii] && !pred[ii])
         {
           pred[ii] = v;
           vizt[ii] = true;
           cd[ended++] = ii;
         }
      }
   }
}

void read ()
{
  int x, y, cap;

  scanf ("%d %d\n", &N, &M);

  for (int i = 1; i <= M; ++ i)
   {
     scanf ("%d %d %d\n", &x, &y, &cap);
     c[x][y] = c[y][x] = cap;
     retn1[i] = x;
     retn2[i] = y;
     ++ gr[x];
     ++ gr[y];
   }

  for (int i = 1; i <= N; ++ i)
   {
     lv[i] = new int [gr[i] + 1];
     lv[i][0] = 0;
   }

  fseek (stdin, 0, SEEK_SET);

  scanf ("%d %d\n", &N, &M);

  for (int i = 1; i <= M; ++ i)
   {
     scanf ("%d %d %d\n", &x, &y, &cap);
     lv[x][++lv[x][0]] = y;
     lv[y][++lv[y][0]] = x;
   }
}

int
 main ()
{
  int ct =0;
  
  freopen (FIN, "rt", stdin);
  freopen (FOUT, "wt", stdout);

  read ();

  ford_fulk ();
  bfs ();
  bft ();
  
  for (int i = 1; i <= M; ++ i)
    if ((vizs[retn1[i]] && vizt[retn2[i]]) ||     
         (vizs[retn2[i]] && vizt[retn1[i]]))
           rez[++ct] = i;
  printf ("%d\n", ct);
  for (int i = 1; i <= ct; ++ i)
    printf ("%d\n", rez[i]);
  return 0;
}