Cod sursa(job #2017388)

Utilizator TincaMateiTinca Matei TincaMatei Data 1 septembrie 2017 00:39:49
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 1000;
const int MAX_M = 10000;
vector<int> graph[1+MAX_N];
int kappa[1+MAX_N][1+MAX_N], q[1+MAX_N], bestfl[1+MAX_N], papa[1+MAX_N];
bool viz[1+MAX_N];

int flow;

struct Edge {
  int a, b;
  inline int other(int nod) {
    return a ^ b ^ nod;
  }
} mc[MAX_M];

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

static inline bool augment(int nod) {
  int st, dr;
  st = dr = 0;
  q[dr++] = 1;
  memset(viz + 1, 0, sizeof(bool) * MAX_N);
  viz[1] = true;
  bestfl[1] = 1000000000;
  while(st < dr && !viz[nod]) {
    int nod = q[st++];
    for(auto it: graph[nod]) {
      int nod2 = mc[it].other(nod);
      if(!viz[nod2] && kappa[nod][nod2] > 0) {
        viz[nod2] = true;
        bestfl[nod2] = min(bestfl[nod], kappa[nod][nod2]);
        q[dr++] = nod2;
        papa[nod2] = nod;
      }
    }
  }

  if(viz[nod]) {
    flow += bestfl[nod];
    int i = nod;
    while(i != 1) {
      int j = papa[i];
      kappa[j][i] -= bestfl[nod];
      kappa[i][j] += bestfl[nod];
      i = j;
    }
    return true;
  }
  return false;
}

static inline int maxflow(int n) {
  flow = 0;
  while(augment(n));
  return flow;
}

char col[1+MAX_N];
void color(int nod, int c, bool fromSource) {
  col[nod] = c;
  for(auto it: graph[nod]) {
    int nod2 = mc[it].other(nod);
    if(col[nod2] == 0 && fromSource && kappa[nod][nod2] > 0)
      color(nod2, c, fromSource);
    else if(col[nod2] == 0 && !fromSource && kappa[nod2][nod] > 0)
      color(nod2, c, fromSource);
  }
}

int main() {
  int n, m, a, b, c, rez;
  FILE *fin = fopen("critice.in", "r");
  fscanf(fin, "%d%d", &n, &m);
  for(int i = 0; i < m; ++i) {
    fscanf(fin, "%d%d%d", &a, &b, &c);
    mc[i].a = a;
    mc[i].b = b;
    kappa[a][b]+=c;
    kappa[b][a]+=c;
    graph[a].push_back(i);
    graph[b].push_back(i);
  }
  fclose(fin);
  maxflow(n);
  color(1, 1, true);
  color(n, 2, false);
  
  rez = 0;
  for(int i = 0; i < m; ++i)
    if(col[mc[i].a] + col[mc[i].b] == 3)
      ++rez;

  FILE *fout = fopen("critice.out", "w");
  fprintf(fout, "%d\n", rez);
  for(int i = 0; i < m; ++i)
    if(col[mc[i].a] + col[mc[i].b] == 3)
      fprintf(fout, "%d\n", i + 1);
  fclose(fout);
  return 0;
}