Cod sursa(job #1666217)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 27 martie 2016 19:36:46
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("critice.in");
ofstream out("critice.out");

const int N = 1005;

int flow[N][N], cap[N][N], f[N], n, m;
bool vis[N], access[2][N];
vector<int> g[N], sol;
vector<pair<int,int>> edge;
queue<int> q;

bool bfs() {
   memset(vis, 0, sizeof(vis));
   vis[1] = 1;
   q.push(1);
   while (!q.empty()) {
      int cur = q.front();
      q.pop();
      if (cur == n) continue;
      for(auto nxt : g[cur]) {
         if(!vis[nxt] && flow[cur][nxt] < cap[cur][nxt]) {
            f[nxt] = cur;
            vis[nxt] = 1;
            q.push(nxt);
         }
      }
   }
   return vis[n];
}

void dfs(bool use[], int cur) {
   use[cur] = 1;
   for(int nxt : g[cur]) {
      if(!use[nxt] && flow[cur][nxt] != cap[cur][nxt] && flow[nxt][cur] != cap[nxt][cur]) {
         dfs(use, nxt);
      }
   }
}

int main() {
   int i, a, b, c, fmin;
   in >> n >> m;
   for (i = 1; i <= m; i++) {
      in >> a >> b >> c;
      g[a].push_back(b);
      g[b].push_back(a);
      cap[a][b] = cap[b][a] = c;
      edge.push_back(make_pair(a, b));
   }
   while (bfs()) {
      for (auto start : g[n]) {
         if(vis[start]) {
            f[n] = start;
            fmin = 1e9;
            for (i = n; i != 1; i = f[i]) {
               fmin = min(fmin, cap[f[i]][i] - flow[f[i]][i]);
            }
            for (i = n; i != 1; i = f[i]) {
               flow[f[i]][i] += fmin;
               flow[i][f[i]] -= fmin;
            }
         }
      }
   }
   dfs(access[0], 1);
   dfs(access[1], n);
   for (i = 0; i < edge.size(); i++) {
      a = edge[i].first;
      b = edge[i].second;
      if ((access[0][a] && access[1][b]) || (access[1][a] && access[0][b])) {
            sol.push_back(i + 1);
      }
   }
   out << sol.size() << '\n';
   for(int i : sol) out << i << '\n';
   return 0;
}