Cod sursa(job #2506134)

Utilizator eilerGabriel-Ciprian Stanciu eiler Data 7 decembrie 2019 16:11:16
Problema Critice Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;

const int infinit=999999999;

int n, m, c[1001][1001], f[1001][1001], t[1001], x[10001], y[10001], z[10001];
vector<int> rez;

bool bf(){
	int nod, i;
	queue<int> q;

	for (i=1; i<=n; i++)
		t[i]=0;

	q.push(1);
	t[1]=-1;
	while (!q.empty()){
		nod=q.front();
		q.pop();
		for (i=1; i<=n; i++)
			if (t[i]==0 && c[nod][i]>f[nod][i]){
				t[i]=nod;
				q.push(i);
				if (i==n)
					return true;
			}
	}
	return false;
}

int main(){
	ifstream fin ("critice.in");
	fin >> n >> m;
	for (int i=1; i<=m; i++){
		fin >> x[i] >> y[i] >> z[i];
		c[x[i]][y[i]]=c[y[i]][x[i]]=z[i];
	}
	fin.close();

	int flux=0;
	while (bf()){
		int i, r;
		r=infinit;

		i=n;
		while (i!=1){
			r=min(r, c[t[i]][i]-f[t[i]][i]);
			i=t[i];
		}

		i=n;
		while (i!=1){
			f[t[i]][i]+=r;
			f[i][t[i]]-=r;
			i=t[i];
		}

		flux+=r;
	}

	for (int i=1; i<=m; i++){
		c[x[i]][y[i]]+=infinit;
		c[y[i]][x[i]]+=infinit;
		if (bf())
			rez.push_back(i);
		c[x[i]][y[i]]-=infinit;
		c[y[i]][x[i]]-=infinit;
	}

	ofstream fout ("critice.out");
	fout << rez.size() << '\n';
	for (unsigned int i=0; i<rez.size(); i++)
		fout << rez[i] << '\n';
	fout.close();

	return 0;
}