Cod sursa(job #2695898)

Utilizator vladdudauDudau Vlad vladdudau Data 14 ianuarie 2021 20:12:22
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <bits/stdc++.h>
#define dim 1001
#define dim2 dim*10

using namespace std;

int n, m, c[dim][dim], p[dim], used[dim], vis[dim2];
vector< pair<int, int> > g[dim];
vector<int> sol;
queue<int> q;

void search(int node) {
	int i, j, in;
	vector< pair<int, int> >::iterator it;

	memset(used, 0, sizeof(used));
	while (q.size()) q.pop();
	q.push(node);
	used[node]=1;

	while (q.size()) {
		i=q.front();
		q.pop();

		for (it=g[i].begin(); it!=g[i].end(); ++it)
			if (!used[it->first]) {
				j=it->first;
				in=it->second;

				if (!c[i][j] || (vis[in] && !c[j][i]))
					if (vis[in]) sol.push_back(in);
					else vis[in]=1;
				else {
					used[j]=1;
					q.push(j);
				}
			}
	}
}

int bfs() {
	int node;
	vector< pair<int, int> >::iterator it;

	memset(used, 0, sizeof(used));
	while (q.size()) q.pop();
	q.push(1);
	used[1]=1;

	while (q.size()) {
		node=q.front();
		q.pop();
		if (node==n) continue;

		for (it=g[node].begin(); it!=g[node].end(); ++it)
			if (!used[it->first] && c[node][it->first]) {
				p[it->first]=node;
				used[it->first]=1;
				q.push(it->first);
			}
	}

	return used[n];
}

void flow() {
	int f, i;
	vector< pair<int, int> >::iterator it;

	for (; bfs(); )
		for (it=g[n].begin(); it!=g[n].end(); ++it) {
			p[n]=it->first;
			f=1<<30;
			for (i=n; i!=1; i=p[i])
				if (c[p[i]][i]<f) f=c[p[i]][i];

			for (i=n; i!=1; i=p[i]) {
				c[p[i]][i]-=f;
				c[i][p[i]]+=f;
			}
		}
}

int main() {
	int i, x, y, z;
	vector<int>::iterator it;
	freopen("critice.in", "r", stdin);
	freopen("critice.out", "w", stdout);

	scanf("%d %d\n", &n, &m);
	for (i=1; i<=m; ++i) {
		scanf("%d %d %d\n", &x, &y, &z);
		g[x].push_back(make_pair(y, i));
		g[y].push_back(make_pair(x, i));
		c[x][y]=z;
		c[y][x]=z;
	}

	flow();
	search(1);
	search(n);

	sort(sol.begin(), sol.end());

	printf("%d\n", sol.size());
	for (it=sol.begin(); it!=sol.end(); ++it)
		printf("%d\n", *it);

	return 0;
}