Cod sursa(job #1693812)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 23 aprilie 2016 22:08:33
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.59 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();
}