Cod sursa(job #562627)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 23 martie 2011 16:49:30
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include<cstdio>
#include<vector>
#include<queue>
#define Nmax 1024
#define Mmax 10010

using namespace std;

vector <int> a[Nmax];
pair<int,int> m[Nmax];
vector <int> sol;
queue <int> c;
int N,M,fx[Nmax][Nmax],cp[Nmax][Nmax],viz[Nmax],t[Nmax];
bool viz_sus[Nmax],viz_jos[Nmax];

int bf(){
	
	memset(viz,0,sizeof(viz));
	
	while(!c.empty())
		c.pop();
		
	c.push(1);
	viz[1]=1;
	
	while(!c.empty()){
		int nod=c.front();
		c.pop();
		
		for(unsigned int i=0;i<a[nod].size();++i)
			if(!viz[a[nod][i]] && cp[nod][a[nod][i]] > fx[nod][a[nod][i]]){
				if(a[nod][i]==N)
					return 1;
				viz[a[nod][i]]=1;
				t[a[nod][i]]=nod;
				c.push(a[nod][i]);
				
			}
	}

	return 0;	
}
void flux(){
	
	while(bf()){
		
		for(vector <int>::iterator i=a[N].begin();i!=a[N].end();++i)
			if(viz[*i] && fx[*i][N] < cp[*i][N]){
				int fmn=10000;
				t[N]=*i;
				
				for(int nod=N;nod!=1;nod=t[nod])
					fmn=min(fmn, cp[t[nod]][nod]-fx[t[nod]][nod]);
				
				if(fmn!=0)
					for(int nod=N;nod!=1;nod=t[nod])
					fx[t[nod]][nod]+=fmn,
					fx[nod][t[nod]]-=fmn;
		}
	}	
}

void df_1_n(int nod){
	
	viz_sus[nod]=1;
	
	for(vector<int>::iterator it=a[nod].begin();it!=a[nod].end();++it)
		if(!viz_sus[*it] && fx[nod][*it] < cp[nod][*it])
			df_1_n(*it);
	
}

void df_n_1(int nod){
	
	viz_jos[nod]=1;
	
	for(vector<int>::iterator it=a[nod].begin();it!=a[nod].end();++it)
		if(!viz_jos[*it] && fx[*it][nod] < cp[*it][nod])
			df_n_1(*it);
	
}
int main(){
	
	freopen("critice.in","r",stdin);
	freopen("critice.out","w",stdout);
	
	scanf("%d%d",&N,&M);
	
	for(int i=1;i<=M;++i){
		int x,y,c;
		
		scanf("%d%d%d",&x,&y,&c);
		
		cp[x][y]=c;
		cp[y][x]=c;
		
		m[i]=make_pair(x,y);
		
		a[x].push_back(y);
		a[y].push_back(x);
	}
	
	flux();
	
	df_1_n(1);
	df_n_1(N);
	
	for(int i=1;i<=M;++i){
		if(viz_jos[m[i].first]&&viz_sus[m[i].second] || viz_jos[m[i].second]&&viz_sus[m[i].first] )
			if(abs(fx[m[i].first][m[i].second]) == cp[m[i].first][m[i].second])
				sol.push_back(i);			
	}
	
	printf("%d\n",sol.size());
	
	for(size_t i=0;i<sol.size();++i)
		printf("%d\n",sol[i]);
return 0;
}