Cod sursa(job #392312)

Utilizator ConsstantinTabacu Raul Consstantin Data 7 februarie 2010 12:31:53
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 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;
			u++;
			q[u] = v[x][i];
			if(v[x][i] == n)return true;
			}
	p++;
	
	}
return false;
}


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(i = n ; t[i] != -1;i = t[i])
		if(c[t[i]][i] < Min)
			Min = c[t[i]][i];
		
	sol += Min;
	
	for(i = n ; t[i] != -1;i = t[i])
		{c[t[i]][i] -= Min;
		c[i][t[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;}