Cod sursa(job #195039)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 16 iunie 2008 09:50:05
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include<stdio.h>
#include<string.h>
#define N 1005
#define M 10005
#define MAX 30005
int niv,n,m,i,v[N][N],c[N][N],f[N][N],nv[N],fol[N],t[N],d[M],v1[N],v2[N],x2[M],y2[M];
void funct(int x,int y,int z){
	nv[x]++;
	nv[y]++;
	v[x][nv[x]]=y;
	v[y][nv[y]]=x;
	c[x][y]=c[y][x]=z;
}
inline int inv(int x){
	if (x>0)
		return x;
	return -x;
}
inline int min(int a,int b){
	if(a<b)
		return a;
	return b;
}
inline int max(int a,int b){
	if (a>b)
		return a;
	return b;
}
int ice(){
	int i,cap=1,coada=1,nod;
	d[1]=1;
	t[1]=0;
	for(i=1;i<=n;i++)
		fol[i]=0;
	fol[1]=1;
	while(cap<=coada){
		nod=d[cap];
		for (i=1;i<=nv[nod];i++)
			if (fol[v[nod][i]]==0 && c[nod][v[nod][i]]-f[nod][v[nod][i]]>0){
				coada++;
				d[coada]=v[nod][i];
				fol[v[nod][i]]=1;
				t[v[nod][i]]=nod;
			}
			cap++;
	}
	return fol[n];
}
void solve(){
	int m;
	while (ice()){
		m=MAX;
		for (i=n;i-1;i=t[i])
			m=min(m,c[t[i]][i]-f[t[i]][i]);
		for (i=n;i-1;i=t[i]){
			f[t[i]][i]+=m;
			f[i][t[i]]-=m;
		}
	}
}
void crit(int nn,int d[]){
	int i,cap=1,coada=1,nod;
	d[1]=nn;
	for(i=1;i<=n;i++)
		fol[i]=0;
	fol[nn]=1;
	while(cap<=coada){
		nod=d[cap];
		for(i=1;i<=nv[nod];i++)
			if(fol[v[nod][i]]==0 && c[nod][v[nod][i]]-inv(f[nod][v[nod][i]])>0){
				coada++;
				d[coada]=v[nod][i];
				fol[v[nod][i]]=1;
			}
			cap++;
	}
	for(i=1;i<=n;i++)
		d[i]=fol[i];
}
int main(){
	int x,y,i,nr=0,c;
	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,&c);
		funct(x,y,c);
		x2[i]=x;
		y2[i]=y;
	}
	solve();
	crit(1,v1);
	crit(n,v2);
	for (i=1;i<=m;i++){
		x=x2[i];
		y=y2[i];
		if ((v1[x]^v2[x]) && (v1[y]^v2[y]) && (v2[x]^v2[y]))
			nr++;
	}
	printf("%d\n",nr);
	for (i=1;i<=m;i++){
		x=x2[i];
		y=y2[i];
		if ((v1[x]^v2[x]) && (v1[y]^v2[y]) && (v2[x]^v2[y]))
			printf("%d\n",i);
	}
	return 0;
}