Cod sursa(job #791311)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 23 septembrie 2012 19:27:05
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <vector>
#include <queue>
#define NMAx 1010
#define MMAx 10100
#define oo (1<<30)
using namespace std;

vector <int> G[NMAx],Sol;
queue <int> Q;
int N,M,paint,sw,viz[NMAx],Flux[NMAx][NMAx];
int T[NMAx],X[MMAx],Y[MMAx];
bool V[NMAx][2];
void DFS(int Nod) {
	
	V[Nod][sw]=1;
	for(int i=0;i<G[Nod].size();i++)
		if(Flux[Nod][G[Nod][i]]&&!V[G[Nod][i]][sw])
			DFS(G[Nod][i]);
	
}
bool BF() {
	
	int i,Nod,Vecin;
	
	Q.push(1);
	++paint;
	viz[1]=paint;
	
	while(!Q.empty()) {
		
		Nod=Q.front();
		Q.pop();
		
		for(i=0;i<G[Nod].size();i++) {
			
			Vecin=G[Nod][i];
			if(!Flux[Nod][Vecin]||viz[Vecin]==paint)
				continue;
			
			viz[Vecin]=paint;
			T[Vecin]=Nod;
			Q.push(Vecin);
			}
		}
	
	return (viz[N]==paint);
	
}
void Solve() {
	
	int i,e,Nod;
	
	while(BF())
		for(i=0;i<G[N].size();i++) {
			
			Nod=G[N][i];
			if(!Flux[Nod][N]||viz[Nod]!=paint)
				continue;
			
			T[N]=Nod;
			
			for(Nod=N,e=oo;Nod!=1;Nod=T[Nod])
				e=min(e,Flux[T[Nod]][Nod]);
			for(Nod=N;Nod!=1;Nod=T[Nod]) {
				Flux[T[Nod]][Nod]-=e;
				Flux[Nod][T[Nod]]+=e;
				}
			}
	
	sw=0;DFS(1);
	sw=1;DFS(N);
	
	for(i=1;i<=M;i++)
		if((!Flux[X[i]][Y[i]] && V[X[i]][0] && V[Y[i]][1]) || (!Flux[Y[i]][X[i]] && V[X[i]][1] && V[Y[i]][0]))
			Sol.push_back(i);
		
}
void Citire() {
	
	int i,C;
	ifstream in("critice.in");
	in>>N>>M;
	
	for(i=1;i<=M;i++) {
		in>>X[i]>>Y[i]>>C;
		G[X[i]].push_back(Y[i]);
		G[Y[i]].push_back(X[i]);
		Flux[X[i]][Y[i]]=Flux[Y[i]][X[i]]=C;
		}
	
	in.close();
	
}
void Afis() {
	
	ofstream out("critice.out");
	out<<Sol.size()<<'\n';
	for(int i=0;i<Sol.size();out<<Sol[i++]<<'\n');
	out.close();
	
}
int main() {
	
	Citire();
	Solve();
	Afis();
	
	return 0;
	
}