Cod sursa(job #1565462)

Utilizator SilviuIIon Silviu SilviuI Data 10 ianuarie 2016 19:58:23
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <stdio.h>
#include <cstring>
#include <vector>
#include <queue>
#define nmax 1010
#define lmax 10010

using namespace std;
struct date { int x,y; };

int n,m,x,y,z;
int fr[nmax],tata[nmax];
int capacity[nmax][nmax],flux[nmax][nmax];
bool s[nmax],f[nmax];
vector <int> g[nmax],sol; date t[lmax];

bool bfs()
{
	memset(fr,0,sizeof(fr));
	queue <int> que;
	que.push(1); fr[1]=1;
	while (!que.empty()) {
		int x=que.front(); que.pop();
		if (x==n) continue;
		for (unsigned int i=0;i<g[x].size();i++)
		    if (fr[g[x][i]]==0 && capacity[x][g[x][i]]!=flux[x][g[x][i]]) {
		    	fr[g[x][i]]=1; tata[g[x][i]]=x; que.push(g[x][i]);
			}
	}
	return (fr[n]==1);
}

void dfs(bool v[nmax],int nod)
{
	v[nod]=true;
	for (unsigned int i=0;i<g[nod].size();i++) {
		if (!v[g[nod][i]] && flux[nod][g[nod][i]]!=capacity[nod][g[nod][i]] && flux[g[nod][i]][nod]!=capacity[g[nod][i]][nod])
		   dfs(v,g[nod][i]);
	}
}

int main()
{
	freopen("critice.in","r",stdin);
	freopen("critice.out","w",stdout);
	scanf("%d %d",&n,&m);
	for (int i=1;i<=m;i++) {
		scanf("%d %d %d",&x,&y,&z);
		capacity[x][y]=capacity[y][x]=z;
		g[x].push_back(y); g[y].push_back(x);
		t[i].x=x; t[i].y=y;
	}
	//max flow
	while (bfs()) {
		for (unsigned int i=0;i<g[n].size();i++)
		    if (fr[g[n][i]]==1 && capacity[g[n][i]][n]!=flux[g[n][i]][n]) {
		    	tata[n]=g[n][i]; int fmin=2e9;
		    	for (int j=n;j>1;j=tata[j])
		    	    fmin=min(fmin,capacity[tata[j]][j]-flux[tata[j]][j]);
		    	if (fmin==0) continue;
		    	for (int j=n;j>1;j=tata[j]) {
		    		flux[tata[j]][j]+=fmin;
		    		flux[j][tata[j]]-=fmin;
				}
			}
	}
	dfs(s,1); dfs(f,n);
	for (int i=1;i<=m;i++)
	    if ((s[t[i].x] && f[t[i].y]) || (s[t[i].y] && f[t[i].x])) sol.push_back(i);
	printf("%d\n",sol.size());
	for (unsigned int i=0;i<sol.size();i++) printf("%d\n",sol[i]);
	return 0;
}