Cod sursa(job #1915142)

Utilizator blackoddAxinie Razvan blackodd Data 8 martie 2017 19:52:30
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;

#define MaxN 1001
#define INF 0x3f3f3f3f

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

int n, m, x, a, b, z, minflow;
int c[MaxN][MaxN], f[MaxN][MaxN], t[MaxN];
pair<int,int> Edge[MaxN];
vector<int> G[MaxN], ans;
bool viz[MaxN], viz1[MaxN], viz2[MaxN];

void Read();
void Solve();
bool Bf();
void Bf(int, bool[]);
void Write();

int main() {
	Read();
	Solve();
	Write();
	
}

void Solve() {
	
	while(Bf()) {
		for ( const auto x : G[n] ) 
			if ( f[x][n] <= c[x][n] && viz[x] ) {
				t[n] = x;
				minflow = INF;
				
				for ( int i = n; i != 1; i = t[i] ) 
					minflow = min(minflow, c[t[i]][i] - f[t[i]][i]);
					
				for ( int i = n ; i != 1; i = t[i] ) {
					f[t[i]][i] += minflow;
					f[i][t[i]] -= minflow;
				}
			}
	}
	
	Bf(1, viz1);
	Bf(n, viz2);
	
	for ( int i = 1; i <= m; ++i ) {
		int x = Edge[i].first;
		int y = Edge[i].second;
		
		if ( (c[x][y] == f[x][y] || c[y][x] == f[y][x]) && ((viz1[x] && viz2[y]) || (viz1[y] && viz2[x])))
			ans.push_back(i);
	}
}

void Write() {
	fout << ans.size() << '\n';
	for ( const auto x : ans ) 
		fout << x << '\n';
}

void Bf(int start, bool viz[] ) {
	queue<int> Q;
	Q.push(start);
	viz[start] = true;
	
	while(Q.size()) {
	    x = Q.front();
		Q.pop();
		
		for ( const auto y : G[x] ) 
			if ( c[x][y] > abs(f[x][y]) && !viz[y] ) {
				viz[y] = true;
				Q.push(y);
			}
			
	}
}	

bool Bf() { 
	queue<int> Q;
	Q.push(1);
	for ( int i = 1; i <= n; ++i ) viz[i] = false;
	viz[1] = true;
	
	while(Q.size()) {
		x = Q.front();
		Q.pop();
		if ( x == n ) break;
		
		for ( const auto y : G[x] ) 
			if ( c[x][y] > f[x][y] && !viz[y] ) {
				viz[y] = true;
				Q.push(y);
				t[y] = x;
			}
	}
	
	return viz[n];
	
}

void Read() { 
	fin >> n >> m;
	
	for ( int i = 1; i <= m; ++i ) {
		fin >> a >> b >> z;
		G[a].push_back(b);
		G[b].push_back(a);
		c[a][b] = c[b][a] = z;
		Edge[i] = {a, b};
	}
}