Cod sursa(job #85047)

Utilizator MariusMarius Stroe Marius Data 19 septembrie 2007 19:38:25
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.73 kb
#include <stdio.h>
#include <stdlib.h>

#define Nmax 1001
#define Mmax 10001

const char filein[] = "critice.in", 
           fileout[] = "critice.out";

int N, M, c[Nmax][Nmax], f[Nmax][Nmax], T[Nmax], gr[Nmax], x[Mmax], y[Mmax], *G[Nmax], Q[Nmax], mark[Nmax];

void readdata()
{
     int i, a, b, cap;
     
     scanf("%d %d", &N, &M);
     for (i = 1; i <= M; ++i)
     {
         scanf("%d %d %d", &a, &b, &cap);
         x[i] = a;
         y[i] = b;
         c[a][b] = cap;
         c[b][a] = cap;
         gr[a]++;
         gr[b]++;
     }
     
     for (i = 1; i <= N; ++i)
     {
         G[i] = (int *) malloc((gr[i]+1) * sizeof(int));
         G[i][gr[i]] = -1;
         gr[i] = 0;
     }
     
     for (i = 1; i <= M; ++i)
     {
         G[x[i]][gr[x[i]]++] = y[i];
         G[y[i]][gr[y[i]]++] = x[i];
     }
}

int min(int a, int b)
{
    if (a < b) return a;
    else return b;
}

int bfs()
{
    int *p, cap, coada, nr, i;
    
    cap = coada = 1;
    Q[cap] = 1;
    for (i = 2; i <= N; ++i) T[i] = -1;
    
    while (cap <= coada)
    {
          nr = Q[cap];
          p = G[nr];
          while (*p != -1)
          {
                if (T[*p] == -1 && (c[nr][*p] - f[nr][*p]) > 0)
                {
                          T[*p] = nr;
                          coada++;
                          Q[coada] = *p;
                          if (*p == N) return 1;
                }
                ++p;
          }
          ++cap;
    }
    return 0;
}

void bf1(int start, int val)
{
     int cap, coada, nr, *p;
     
     cap = coada = 1;
     Q[cap] = start;
     mark[start] = val;
     
     while (cap <= coada)
     {
           nr = Q[cap];
           p = G[nr];
           while (*p != -1)
           {
                 if (mark[*p] != val && (c[nr][*p] - f[nr][*p]) > 0)
                 {
                              mark[*p] = val;
                              coada++;
                              Q[coada] = *p;
                 }
                 ++p;
           }
           ++cap;
     }
}

void bf2(int start, int val)
{
     int cap, coada, nr, *p;
     
     cap = coada = 1;
     Q[cap] = start;
     mark[start] = val;
     
     while (cap <= coada)
     {
           nr = Q[cap];
           p = G[nr];
           while (*p != -1)
           {
                 if (mark[*p] != val && (c[*p][nr] - f[*p][nr]) > 0)
                 {
                              mark[*p] = val;
                              coada++;
                              Q[coada] = *p;
                 }
                 ++p;
           }
           ++cap;
     }
}

void solve()
{
     int i, j, r, rez = 0;
          
     while (bfs())
     {
           for (i = 1; i <= N; ++i)
           {
               if (T[i] == -1 || c[i][N] <= f[i][N])
                  continue;
                  
               r = c[i][N] - f[i][N];    
               for (j = i; j != 1; j = T[j])
                   r = min(r, c[T[j]][j] - f[T[j]][j]);
               if (r == 0) continue;
               
               f[i][N] += r; f[N][i] -=r;
               for (j = i; j != 1; j = T[j])
               {
                   f[T[j]][j] += r;
                   f[j][T[j]] -= r;
               }
           }
           
     }   
     
     bf1(1, 1);
     bf2(N, 2);
          
     for (i = 1; i <= M; ++i)
         if (mark[x[i]] + mark[y[i]] == 3) rez++;
         
     printf("%d\n", rez);
     for (i = 1; i <= M; ++i)
         if (mark[x[i]] + mark[y[i]] == 3)
            printf("%d\n", i);
     
}

int main()
{
    freopen(filein, "r", stdin);
    freopen(fileout, "w", stdout);
    
    readdata();
    solve();
}