Cod sursa(job #2197893)

Utilizator DenisacheDenis Ehorovici Denisache Data 23 aprilie 2018 02:51:11
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <fstream>
#include <limits.h>
#include <math.h>
#include <queue>
#include <set>
#include <array>
#include <bitset>

using namespace std;

int cap[1005][1005];
int flow[1005][1005];
int prv[1005];

vector<int> G[1005];
bitset<1005> used;

bool bfs(int source, int sink) {
	queue<int> Q;
	used.reset();

	Q.push(source);
	used[source] = 1;

	while (!Q.empty()) {
		int nod = Q.front();
		Q.pop();

		if (nod == sink) continue;

		for (auto& dest: G[nod]) {
			if (used[dest] || flow[nod][dest] == cap[nod][dest]) continue;

			Q.push(dest);
			prv[dest] = nod;
			used[dest] = 1;
		}
	}

	return used[sink];
}

int edmond_karp(int source, int sink) {
	int res = 0;
	const int INF = int(2e9);

	while (bfs(source, sink)) {
		for (auto& neigh: G[sink]) {
			if (flow[neigh][sink] == cap[neigh][sink] || !used[neigh]) continue;

			int minFlow = INF;

			prv[sink] = neigh;

			for (int i = sink; i != source; i = prv[i]) {
				minFlow = min(minFlow, cap[prv[i]][i] - flow[prv[i]][i]);
			}

			if (minFlow == 0) continue;

			for (int i = sink; i != source; i = prv[i]) {
				flow[prv[i]][i] += minFlow;
				flow[i][prv[i]] -= minFlow;
			}

			res += minFlow;
		}
	}

	return res;
}

int edmond_karp_aux(int source, int sink) {
	int res = 0;
	const int INF = int(2e9);

	bfs(source, sink);

	int neigh = prv[sink];

	int minFlow = INF;

	prv[sink] = neigh;

	for (int i = sink; i != source; i = prv[i]) {
		minFlow = min(minFlow, cap[prv[i]][i] - flow[prv[i]][i]);
	}

	res += minFlow;

	return res;
}

struct Edge {
	int a, b;

	Edge() {}

	Edge(int a, int b) {
		this->a = a;
		this->b = b;
	}
};

int main() {
	ios::sync_with_stdio(false);

	string filename = "critice";

	ifstream cin(filename + ".in");
	ofstream cout(filename + ".out");

	int n, m;
	cin >> n >> m;

	vector< Edge > edges;

	for (int i = 1; i <= m; ++i) {
		int a, b, c;
		cin >> a >> b >> c;

		edges.emplace_back(a, b);

		G[a].push_back(b);
		G[b].push_back(a);

		cap[a][b] = c;
		cap[b][a] = c;
	}

	int initFlux = edmond_karp(1, n);
	vector<int> critEdges;

	for (int i = 0; i < m; ++i) {
		++cap[edges[i].a][edges[i].b];
		++cap[edges[i].b][edges[i].a];

		if (edmond_karp_aux(1, n) > 0)
			critEdges.push_back(i + 1);

		--cap[edges[i].a][edges[i].b];
		--cap[edges[i].b][edges[i].a];
	}

	cout << critEdges.size() << "\n";
	
	for (auto& index : critEdges)
		cout << index << "\n";

	//system("pause");
	return 0;
}