Cod sursa(job #461034)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 5 iunie 2010 14:24:49
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define Nmax 1005
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define INF 2147000000
using namespace std;

vector< int > G[Nmax],v;
vector< int >:: iterator it;
queue< int > Q;
pair< int,int > M[Nmax*10];
int C[Nmax][Nmax],F[Nmax][Nmax];
int viz[2][Nmax],prev[Nmax];
int i,x,y,z,n,m,nr,wh;
int fmin,fmax;

inline int Minim(int x,int y){ return x<y ? x:y; }
inline int abs(int x){ return x>0 ? x:-x; }

int BF(int s,int st){
	int x;
	memset(viz[st],0,sizeof(viz[st]));
	while(!Q.empty()) Q.pop();
	Q.push(s); viz[st][s]=1;
	
	while( ! Q.empty() ){
		x=Q.front(); Q.pop();
		if(x==n) return 1;
		
		for(it=G[x].begin(); it!=G[x].end(); ++it){
			if(viz[st][*it] || F[x][*it] == C[x][*it]) continue;
			
			viz[st][*it]=1;
			Q.push(*it);
			prev[*it]=x;
		}
	}
	return viz[st][n];
}

void BFC(int s,int st){
	int x;
	memset(viz[st],0,sizeof(viz[st]));
	Q.push(s); viz[st][s]=1;
	
	while( ! Q.empty() ){
		x=Q.front(); Q.pop();
		
		for(it=G[x].begin(); it!=G[x].end(); ++it){
			if(viz[st][*it] || abs(F[x][*it]) == C[x][*it]) continue;
			
			viz[st][*it]=1;
			Q.push(*it);
		}
	}
	//return viz[st][n];
}

int main(){
	freopen("critice.in","r",stdin);
	freopen("critice.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;++i){
		scanf("%d%d%d",&x,&y,&z);
		C[x][y]=C[y][x]=z;
		M[i]=mp(x,y);
		G[x].pb(y);
		G[y].pb(x);
	}
	
	while( BF(1,0) ){
		//for(it=G[n].begin(); it!=G[n].end(); ++it)
		//if( viz[0][*it] ){
			
			fmin=INF; //prev[wh]=*it;
			for(wh=n; wh!=1 ; wh=prev[wh])
				fmin=Minim(fmin,C[prev[wh]][wh]-F[prev[wh]][wh]);
			if( fmin==0 ) continue;
			
			for(wh=n; wh!=1; wh=prev[wh]){
				F[prev[wh]][wh] += fmin;
				F[wh][prev[wh]] -= fmin;
			}
			
			fmax += fmin;
	}
	
	BFC(1,0);
	BFC(n,1);
	
	for(i=1;i<=m;++i)
		if( (viz[0][M[i].x] && viz[1][M[i].y]) 
		  ||(viz[0][M[i].y] && viz[1][M[i].x]) ) ++nr,v.pb(i); 
		
	printf("%d\n",nr);
	for(it=v.begin(); it!=v.end(); ++it) printf("%d\n",*it);
	fclose(stdin); fclose(stdout);
	return 0;
}