Cod sursa(job #2277165)

Utilizator shantih1Alex S Hill shantih1 Data 5 noiembrie 2018 20:49:12
Problema Critice Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#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],s[1024];

int make_bf(bool ok)
{	
	for(int i=1;i<=n;i++)	d[i]=0;
	while(!q.empty())	q.pop_front();
	if(ok)	d[n]=1,	t[n]=1, q.pb(n);
	
	d[1]=1;
	q.pb(1);
	while(!q.empty())
	{
		x=q.front(), q.pop_front();
		if(x==n&&!ok)	return d[n];
		for(int i:ad[x])
			if(d[i]==0 && c[x][i])
				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];
	}
	if(mn==0)	return;
	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=1;i<=m;i++)
	{
		fin>>j>>x>>nr;
		c[j][x]=c[x][j]=nr;
		ad[j].pb(x);
		ad[x].pb(j);
		v[i]={j,x};
	}
	
	int ns;
	while(make_bf(0))
	{
		ns=0;
		for(int j:ad[n])
			if(d[j] && c[j][n])	s[++ns]={d[j],j};
		sort(s+1,s+ns+1);
		
		for(i=1;i<=ns;i++)
			t[n]=s[i].second, update();
	}
	
	nr=make_bf(1);
	
	for(i=1;i<=m;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";
}