Cod sursa(job #921503)

Utilizator Marius96Marius Gavrilescu Marius96 Data 21 martie 2013 00:58:51
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<cstdio>
#include<cstdlib>
#include<cstring>

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

static bool a[1005],b[1005];
static int c[1005][1005], f[1005][1005], parent[1005];
static int seen[1005], seenc;
static int n;
static std::vector<int> v[1005];
static struct
{
	int x,y;
}e[10005];

bool bfs(void)
{
	std::queue<int> q;
	q.push (1);
	seen[1]=++seenc;

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

	return 0;
}

void dfs (int i, bool *s)
{
	s[i]=1;
	for(std::vector<int>::iterator it=v[i].begin();it!=v[i].end();it++)
		if(c[i][*it] != abs (f[i][*it]) && !a[*it] && !b[*it])
			dfs (*it,s);
}

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 (e[i].y);
		v[e[i].y].push_back (e[i].x);
	}

	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;
	}

	dfs (1, a);
	dfs (n, b);

	std::vector<int> 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;
}