Cod sursa(job #1709707)

Utilizator vand_bot_la_PAUPB Mardale Mocanu Vasilache vand_bot_la_PA Data 28 mai 2016 13:32:52
Problema Tribut Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.69 kb
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
#define MAX 210
#define INF 1<<30
using namespace std;

int t, n, m, c, s, F[MAX][MAX], C[MAX][MAX], p[MAX], cost;
bool viz[MAX];
vector<int> l[MAX];

bool bfs(){
	memset(viz, 0, MAX * sizeof(bool));
	queue<int> q;
	q.push(0);

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

	return viz[n + m + 1];
}

int main(){
	freopen("tribut.in", "r", stdin);
	freopen("tribut.out", "w", stdout);
	scanf("%d", &t);
	for(int k = 0; k < t; ++k){
		cost = 0;
		scanf("%d%d", &n, &m);
		int d = n + m + 1;
		for(int i = 0; i < MAX; ++i){
			memset(F, 0, MAX * sizeof(int));
			memset(C, 0, MAX * sizeof(int));
			memset(p, 0, MAX * sizeof(int));
			l[i].clear();
		}

		for(int i = 1; i <= n; ++i){
			scanf("%d", &C[0][i]);
			l[0].push_back(i);
			l[i].push_back(0);
		}
		for(int i = 1; i <= m; ++i){
			l[n + i].push_back(n + m + 1);
			l[d].push_back(n + i);
			scanf("%d%d", &c, &C[n + i][d]);
			for(int j = 0; j < c; ++j){
				scanf("%d", &s);
				C[s][n + i] = INF;
				l[s].push_back(n + i);
				l[n + i].push_back(s);
			}
		}

		while(bfs()){
			for(int i = n + 1; i < d; ++i)
				if(viz[i] && C[i][d] != F[i][d]){
					p[d] = i;
					int u = d, v;
					int minim = INF;

					while(u != 0){
						v = p[u];
						minim = min(minim, C[v][u] - F[v][u]);
						u = v;
					}

					cost += minim;
					u = d;
					while(u != 0){
						v = p[u];
						F[v][u] += minim;
						F[u][v] -= minim;
						u = v;
					}
			}
		}

		printf("%d\n", cost);
	}

	return 0;
}