Cod sursa(job #1732628)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 22 iulie 2016 02:06:26
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <functional>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <iomanip>
#define NMAX 1005
#define INF 0x3f3f3f3f
#define pb push_back

using namespace std;

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

int C[NMAX][NMAX],F[NMAX][NMAX],viz[NMAX],viz1[NMAX],viz2[NMAX],p[NMAX],n;
vector<int> v[NMAX],res;
vector<pair<int,int> > lista;

int BFSflux() {
	int x,i,y;

	queue<int> Q;
	Q.push(1);
	for(i=1;i<=n;++i) viz[i]=0;
	viz[1]=1;
	while(!Q.empty()) {
		x=Q.front();
		Q.pop();
		if(x==n) break;

		for(i=0;i<v[x].size();++i) {
			y=v[x][i];

			if(C[x][y]>F[x][y] && !viz[y]) {
				viz[y]=1;
				Q.push(y);
				p[y]=x;
			}
		}
	}

	return viz[n];
}

void BFS(int start, int viz[]) {
	int x,i,y;

	queue<int> Q;
	viz[start]=1;
	Q.push(start);
	while(!Q.empty()) {
		x=Q.front();
		Q.pop();

		for(i=0;i<v[x].size();++i) {
			y=v[x][i];

			if(C[x][y]>abs(F[x][y]) && !viz[y]) {
				viz[y]=1;
				Q.push(y);
			}
		}
	}
}

int main() {
    int m,i,fmin,x,y,c;

	fin>>n>>m;
	lista.pb({0,0});
	for(i=0;i<m;++i) {
		fin>>x>>y>>c;
		lista.pb({x,y});
		v[x].pb(y);
		v[y].pb(x);
		C[x][y]=C[y][x]=c;
	}

	while(BFSflux()) {
		for(i=0;i<v[n].size();++i) {
			x=v[n][i];
			if(C[x][n]<=F[x][n] || !viz[n]) continue;
			p[n]=x;
			fmin=INF;

			x=n;
			while(x!=1) {
				fmin=min(fmin,C[p[x]][x]-F[p[x]][x]);
				x=p[x];
			}

			if(fmin==0) continue;
			x=n;
			while(x!=1) {
				F[p[x]][x]+=fmin;
				F[x][p[x]]-=fmin;
				x=p[x];
			}
		}
	}

	BFS(1,viz1);
	BFS(n,viz2);
	for(i=1;i<=m;++i) {
		x=lista[i].first;
		y=lista[i].second;

		if((C[x][y]==F[x][y]||C[y][x]==F[y][x]) && ((viz1[x]&&viz2[y]) || (viz1[y]&&viz2[x])))
			res.pb(i);
	}

	fout<<res.size()<<'\n';
	for(i=0;i<res.size();++i) fout<<res[i]<<'\n';

    return 0;
}