Cod sursa(job #2277062)

Utilizator shantih1Alex S Hill shantih1 Data 5 noiembrie 2018 19:26:52
Problema Critice Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define pb push_back

using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");

int n,m,i,j,nr,nrz,x,nv,vmx=1<<20;
int c[1024][1024],d[1024],t[1024];
vector<int> ad[1024];
deque<int> q;
pair<int,int> v[10005];

int make_bf(bool ok)
{	
	for(int i=1;i<=n;i++)	d[i]=0;
	if(ok)	d[n]=1;
	d[1]=1;
	q.pb(1);
	while(!q.empty())
	{
		x=q.front(), q.pop_front();
		for(int i:ad[x])
			if(c[x][i] && d[i]==0)
				d[i]=d[x]+1, t[i]=(ok)?t[x]:x, q.pb(i);
	}
	return d[n];
}
void update()
{
	int x=t[n],st=n,mn=vmx;
	while(x)
	{
		mn=min(mn, c[x][st]);
		x=t[x];	st=t[st];
	}
	x=t[n];	st=n;
	while(x)
	{
		c[x][st]-=mn;
		c[st][x]-=mn;
		x=t[x];	st=t[st];
	}
}

int main() {
	
	fin>>n>>m;
	for(;i<=m;i++)
	{
		fin>>j>>x>>nr;
		c[j][x]=c[x][j]=nr;
		ad[j].pb(x);
		ad[x].pb(j);
		v[++nv]={j,x};
	}
	
	while(make_bf(0))
		for(int i:ad[n])
		{
			t[n]=i;
			update();
		}
	
	d[n]=1;
	q.pb(n);
	make_bf(1);
	
	for(i=1;i<=n;i++)
		if(d[v[i].first]&&d[v[i].second]&&t[v[i].first]!=t[v[i].second])
			v[++nrz].first=i;
	
	fout<<nrz<<"\n";
	for(i=1;i<=nrz;i++)
		fout<<v[i].first<<"\n";
}