Cod sursa(job #796776)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 12 octombrie 2012 15:34:03
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<string.h>
using namespace std;
const int NMAX = 1001;
const int MMAX = 10001;
const int DIM = 10000;
struct muchie {
	int x,y;
};
vector <int> v[NMAX];
muchie a[MMAX];
int capacity[NMAX][NMAX],flux[NMAX][NMAX],p[NMAX],viz[NMAX],c[NMAX],sol[MMAX],n,poz;
char buff[DIM];
void citeste(int &numar)
{
	numar=0;
	while(buff[poz]<'0' || buff[poz]>'9')     
		if(++poz==DIM) 
			fread(buff,1,DIM,stdin),poz=0;
	while ('0'<=buff[poz] && buff[poz]<='9') {
		numar=numar*10+buff[poz]-'0';
		if(++poz==DIM) 
			fread(buff,1,DIM,stdin),poz=0;               
	}     
}
int bfs()
{
	int st,dr,x;
	st=1;
	dr=1;
	c[st]=1;
	memset(viz,0,sizeof(viz));
	viz[1]=1;
	while(st<=dr) {
		x=c[st];
		st++;
		for(vector <int> :: iterator it=v[x].begin();it!=v[x].end();it++) 
			if(viz[*it]==0 && capacity[x][*it]>flux[x][*it]) {
				viz[*it]=1;
				c[++dr]=*it;
				p[*it]=x;
			}
	}
	return viz[n];
}
inline int saturata(int x, int y)
{
	if(max(flux[x][y],flux[y][x])==capacity[x][y])
		return 1;
	return 0;
}
void bfs2(int x, int y)
{
	int st,dr;
	st=1;
	dr=1;
	c[st]=x;
	viz[x]=y;
	while(st<=dr) {
		x=c[st];
		st++;
		for(vector <int> :: iterator it=v[x].begin();it!=v[x].end();it++) 
			if(viz[*it]==0 && saturata(x,*it)==0) {
				viz[*it]=y;
				c[++dr]=*it;
			}
	}
}
int drum(int x, int y)
{
	if( ( viz[1]==viz[x] && viz[y]==viz[n] ) || ( viz[1]==viz[y] && viz[x]==viz[n] ) )
		return 1;
	return 0;
}
int main ()
{
	int i,x,y,m,cc,fluxcurent,nod;
	freopen("critice.in","r",stdin);
	freopen("critice.out","w",stdout);
	citeste(n);
	citeste(m);
	for(i=1;i<=m;i++) {
		citeste(x);
		citeste(y);
		citeste(cc);
		v[x].push_back(y);
		v[y].push_back(x);
		capacity[x][y]=cc;
		capacity[y][x]=cc;
		a[i].x=x;
		a[i].y=y;
	}
	fclose(stdin);
	while(bfs()) {
		for(vector <int> :: iterator it=v[n].begin();it!=v[n].end();it++) {
			p[n]=*it;
			fluxcurent=(1<<30);
			for(nod=n;nod!=1;nod=p[nod]) 
				fluxcurent=min(fluxcurent,capacity[p[nod]][nod]-flux[p[nod]][nod]);
			for(nod=n;nod!=1;nod=p[nod]) {
				flux[p[nod]][nod]=flux[p[nod]][nod]+fluxcurent;
				flux[nod][p[nod]]=flux[nod][p[nod]]-fluxcurent;
			}
		}
	}
	memset(viz,0,sizeof(viz));
	for(i=1;i<=n;i++)
		if(viz[i]==0) 
			bfs2(i,i);
	for(i=1;i<=m;i++)
		if(saturata(a[i].x,a[i].y)) {
			if(drum(a[i].x,a[i].y)==1) 
				sol[++sol[0]]=i;
		}
	printf("%d\n",sol[0]);
	for(i=1;i<=sol[0];i++)
		printf("%d\n",sol[i]);
	fclose(stdout);
	return 0;
}