Cod sursa(job #1533804)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 22 noiembrie 2015 23:10:25
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
#define pii pair<int, int>
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define MAX 1005
#define INF 1<<30
using namespace std;

int n, m, x, y, z, F[MAX][MAX], C[MAX][MAX], flux, path[MAX];
pii lat[10 * MAX];
vector<int> l[MAX], sol;
bool viz[MAX], viz2[MAX];

bool bfs(){
	memset(viz + 1, 0, n);
	queue<int> q;
	viz[1] = 1;
	q.push(1);

	while(!q.empty()){
		int x = q.front();
		q.pop();

		if(x == n)
			continue;
		
		for(int i = 0; i < l[x].size(); i++){
			int y = l[x][i];
			if(!viz[y] && C[x][y] != F[x][y]){
				viz[y] = 1;
				path[y] = x;
				q.push(y);
			}
		}
	}
	return viz[n];
}

void bfs2(int s, bool viz[]){
	memset(viz + 1, 0, n);
	queue<int> q;
	viz[s] = 1;
	q.push(s);

	while(!q.empty()){
		int x = q.front();
		q.pop();
		for (int i = 0; i < l[x].size(); i++){
			int y = l[x][i];
			if(C[x][y] == F[x][y] || C[y][x] == F[y][x] || viz[y])
				continue;
			viz[y] = 1;
			q.push(y);
		}
	}
}

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);
		l[x].push_back(y);
		l[y].push_back(x);
		lat[i] = make_pair(x, y);
		C[x][y] = z;
		C[y][x] = z;
	}

	while(bfs())
		for(int i = 0; i < l[n].size(); i++)
			if(viz[l[n][i]] && C[l[n][i]][n] != F[l[n][i]][n]){
				path[n] = l[n][i];
				int u = n, minim = INF;
				while(u != 1){
					int v = path[u];
					minim = min(minim, C[v][u] - F[v][u]);
					u = v;
				}
				flux += minim;
				u = n;
				while(u != 1){
					int v = path[u];
					F[v][u] += minim;
					F[u][v] -= minim;
					u = v;
				}
			}

	bfs2(1, viz);
	bfs2(n, viz2);

	for(int i = 1; i <= m; i++){
		int x = lat[i].first, y = lat[i].second;
		if(C[x][y] == F[x][y] && viz[x] && !viz[y] && viz2[y] && !viz2[x])
			sol.push_back(i);
		else if(C[y][x] == F[y][x] && viz[y] && !viz[x] && viz2[x] && !viz2[y])
			sol.push_back(i);
	}
	printf("%d\n", (int)sol.size());
	for(int i = 0; i < (int)sol.size(); i++)
		printf("%d\n", sol[i]);
	return 0;
}