Cod sursa(job #646121)

Utilizator balakraz94abcd efgh balakraz94 Data 10 decembrie 2011 22:07:17
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#define infile "critice.in"
#define outfile "critice.out"
#define n_max 1005
#define INF 1<<30
#define pb push_back
#define FOR(g) \
   for(vector<int> ::iterator it = g.begin(); it!=g.end(); ++it)
using namespace std;


vector < int > v[n_max], sol;

bitset < n_max > viz;

int C[n_max][n_max], F[n_max][n_max], edge[n_max][n_max], T[n_max];

int N, M;


void citeste()
{
	freopen(infile,"r",stdin);
	
	scanf("%d %d", &N, &M);
	
	int x, y, cap;
	
	for(int i=1;i<=M;i++)
	{
		scanf("%d %d %d",&x, &y, &cap);
		
		v[x].pb(y);
		v[y].pb(x);
		
		C[x][y] = C[y][x] = cap;	
		edge[x][y] = edge[y][x] = i;
	}
	
	fclose(stdin);
}


int bfs(int S, int D, bitset <n_max> &viz)
{
	queue < int > q;
	
	viz.reset();
	q.push(S);
	viz[S] = 1;
	
	while(!q.empty())
	{
		int x = q.front();
		q.pop();
		
		if(x == D)
			return 1;
		
		FOR(v[x])
			if(!viz[*it] && C[x][*it] - F[x][*it] > 0)
			{
				q.push(*it);
				viz[*it] = 1;
				T[*it] = x;
			}
	}
	
	return 0;
}



void rezolva()
{
	//vector <int> ::iterator it;
	
	while(bfs(1, N, viz))
	{
		int flux = INF;
		
		for(int i = N; i!=1; i = T[i])
			flux = min(flux, C[T[i]][i] - F[T[i]][i]);
		
		for(int i = N; i!=1; i = T[i])
			F[T[i]][i] += flux, F[i][T[i]] += flux;
	}
	
	bitset <n_max> viz1, viz2;
	
	bfs(1,N,viz1);
	bfs(N,1,viz2);
	
	for(int i=1; i<=N; i++)
		FOR(v[i])
			if(C[i][*it] == F[i][*it] && viz1[i] && viz2[*it])
				sol.pb(edge[i][*it]);
	
	sort(sol.begin(), sol.end());
	
	//it = unique(sol.begin(),sol.end());
	
	//sol.resize( it - sol.begin());
}




void afiseaza()
{
	freopen(outfile,"w",stdout);
	
	printf("%d\n",sol.size());
	
	FOR(sol)
	    printf("%d ",*it);
	
	fclose(stdout);
}


int main()
{
	citeste();
	rezolva();
	afiseaza();
	
	return 0;
}