Cod sursa(job #920110)

Utilizator Marius96Marius Gavrilescu Marius96 Data 20 martie 2013 02:00:04
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<vector>
#include<set>
#include<queue>
#define min(a,b) ((a)<(b)?(a):(b))

static short c[1005][1005], f[1005][1005], parent[1005];
static bool seen[1005];
static int n;
static std::vector<short> v[1005];
static struct 
{
	int x,y;

	int other (int a)const
		{
			return a==x ? y : x;
		}
}e[10005];

bool bfs(void)
{
	memset (seen, 0, sizeof seen);

	std::queue<int> q;
	q.push (1);
	seen[1]=1;

	while(!q.empty()){
		int n=q.front();
		q.pop();
		for(std::vector<short>::iterator it=v[n].begin();it!=v[n].end();it++){
			int m=e[*it].other (n);
			if(c[n][m] != f[n][m] && !seen[m]){
				seen[m]=1;
				q.push (m);
				parent[m]=n;
				if(m==::n)
					return 1;
			}
		}
	}
	return 0;
}

bool ss[10005];
std::vector<int> r;

void bfs (int n)
{
	memset (seen, 0, sizeof seen);
	std::queue<int> q;
	q.push (n);
	seen[n]=1;

	while(!q.empty()){
		int i=q.front();
		q.pop();

		for(std::vector<short>::iterator it=v[i].begin();it!=v[i].end();it++){
			int m=e[*it].other (i);
			if(!seen[m]){
				if(c[i][m] == abs (f[i][m]) || (ss[i] && abs (f[m][i])==c[m][i])){
					if(ss[*it])
						r.push_back (*it+1);
					else
						ss[*it]=1;
				} else {
					seen[m]=1;
					q.push (m);
				}
			}
		}
	}
}

int main (void)
{
	freopen ("critice.in","r",stdin);
#ifdef INFOARENA
	freopen ("critice.out","w",stdout);
#endif

	int m;
	scanf ("%d%d",&n,&m);

	for(int i=0;i<m;i++){
		int z;
		scanf ("%d%d%d",&e[i].x,&e[i].y,&z);
		if(z==0)
			continue;
		c[e[i].x][e[i].y]=c[e[i].y][e[i].x]=z;
		v[e[i].x].push_back (i);
		v[e[i].y].push_back (i);
	}

	while(bfs()){
		int fmin=0x3F3F3F;
		for(int i=n;i>1;i=parent[i])
			fmin=min (fmin, c[parent[i]][i] - f[parent[i]][i]);
		for(int i=n;i>1;i=parent[i])
			f[parent[i]][i]+=fmin, f[i][parent[i]]-=fmin;
	}

	bfs (1);
	bfs (n);

//	std::vector<short> r;
//	for(int i=0;i<m;i++)
//		if(abs (f[e[i].x][e[i].y]) == c[e[i].x][e[i].y] && ((a[e[i].x] && b[e[i].y]) || (a[e[i].y] && b[e[i].x])))
//				r.push_back (i+1);

	printf ("%lu\n",r.size());
	for(unsigned i=0;i<r.size();i++)
		printf ("%d\n",r[i]);
	return 0;
}