Cod sursa(job #392445)

Utilizator ConsstantinTabacu Raul Consstantin Data 7 februarie 2010 15:34:46
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
struct muchie{int a,b,c;
			bool ok;} x[ 10010 ];
vector<int> v[ 1005 ];
int i,j,k,l,m,n,q[ 1005 ],t[ 1005 ],nr,c[1002][1002],Flux,flux;

int dfs(){
int  p = 1,u=1,N,i;

memset(t,0,sizeof(t));
q[1] = 1;
int x;
t[1] = -1;
while(p <= u)
	{x = q[p];
	N = v[x].size();
	for(i = 0; i < N ; i++)
		if(!t[v[x][i]] && c[x][v[x][i]])
			{t[v[x][i]] = x;
			if(v[x][i] != n){
				u++;
				q[u] = v[x][i];}
			}
	p++;
	
	}
return tata[n];
}


int calc_flux(){
memset(c,0,sizeof(c));
int i,sol = 0,Min;
for(i = 1 ; i <= m ; i++)
	c[x[i].a][x[i].b] = c[x[i].b][x[i].a] = x[i].c;
while(dfs()){
	Min = 1<<30;
	for(j = 0; j < v[n].size() ; j++)
		if(t[v[n][j])
			{Min = c[n][t[v[n][i]];
			for(i = v[n][j] ; t[i] != n ; i = t[i])
				if(c[i][t[i]] < Min)Min = c[i][t[i]];
			
			sol+= Min;
			c[v[n][j]][n] -= Min; c[n][v[n][j]] -= Min;
			for(i = v[n][j] ; t[i] != n ; i = t[i]){
				c[i][t[i]] -= Min;
				c[t[i]][i] -= Min;
				}
			}
}
return sol;
}

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[i].a,&x[i].b,&x[i].c);
	v[x[i].a].push_back(x[i].b);
	v[x[i].b].push_back(x[i].a);
	}

Flux = calc_flux();
for(i = 1 ; i <= m ; i++)
	if(c[x[i].a][x[i].b] == 0)
		x[i].ok = true;
	
for(i = 1 ; i <= m ; i++)
	if(x[i].ok)
		{x[i].c ++;
		flux = calc_flux();
		if(flux <= Flux)
			x[i].ok = false;
		else
			nr++;
		x[i].c --;
		}
printf("%d\n",nr);

for(i = 1 ; i <= m ; i++)
	if(x[i].ok)
		printf("%d\n",i);
return 0;}