Cod sursa(job #602493)

Utilizator S7012MYPetru Trimbitas S7012MY Data 11 iulie 2011 17:25:30
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <queue>
#include <vector>
#include <bitset>
#define DN 1005
#define x first
#define y second
using namespace std;

typedef pair<int, int> per;
typedef vector<per>::iterator it;

int n,m,fm,cap[DN][DN],fl[DN][DN],pre[DN];
bitset<DN> viz[DN],v/*vizm*/;
queue<int> c;
vector<per> gr[DN];
vector<int> rez;

bool bfs() {
	memset(pre,-1,sizeof(pre));
	pre[1]=0;
	for(c.push(1);c.size(); c.pop()) {
		int fr=c.front();
		for(int i=1; i<=n; ++i) if(-1==pre[i] && fl[fr][i]<cap[fr][i]) {
			c.push(i);
			pre[i]=fr;
		}
	}
	return pre[n]!=-1;
}

void parc(int s) {
	viz&=0;
	viz[s]=1;
	for(c.push(s);c.size();c.pop()) {
		int fr=c.front();
		for(it i=gr[fr].begin(); i!=gr[fr].end(); ++i) {
			int nod=i->x,ord=i->y;
			if(viz[nod]) continue;
			if(fl[fr][nod]==cap[fr][nod] || (v[ord] && fl[nod][fr]==cap[nod][fr])) {
				if(v[ord]) rez.push_back(ord);
				else v[ord]=1;
			}else {
				viz[nod]=1;
				c.push(nod);
			}
		}
	}
}

int main()
{
	ifstream f("critice.in");
	ofstream g("critice.out");
	f>>n>>m;
	for(int i=1; i<=m; ++i) {
		int x,y,c;
		f>>x>>y>>c;
		cap[x][y]=c;
		gr[x].push_back(make_pair(y,i));
		gr[y].push_back(make_pair(x,i));
	}
	int c;
	for(;bfs();) for(int i=1; i<=n; ++i) if(fl[i][n]<cap[i][n]){
		c=fl[i][n]-cap[i][n];
		for(int y=i; pre[y];y=pre[y]) c=min(c,cap[pre[y]][y]-fl[pre[y]][y]);
		fm+=c;
		fl[i][n]+=c; fl[n][i]-=c;
		for(int y=i;pre[y];y=pre[y]) {
			fl[pre[y]][y]+=c;
			fl[y][pre[y]]-=c;
		}
	}
	parc(1); parc(n);
	g<<rez.size()<<'\n';
	sort(rez.begin(),rez.end());
	for(int i=0; i<rez.size(); ++i) g<<rez[i]<<'\n';
	return 0;
}