Cod sursa(job #3042229)

Utilizator LXGALXGA a LXGA Data 4 aprilie 2023 20:32:39
Problema Tribut Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.34 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#define ll long long
using namespace std;
ifstream cin("tribut.in");
ofstream cout("tribut.out");
int n,m,t,u,k;
vector<int> g[201];
int cap[205][205],v[101];
int p[205];
int nflow(int s,int t)
{
	for(int i=0;i<=n+m+1;i++)
		p[i]=-1;
	p[s]=-2;
	queue<pair<int,int>> q;
	q.push({s,2e9});
	while(!q.empty())
	{
		int a=q.front().first,b=q.front().second;
		q.pop();
		for(int i:g[a])
		{
			if(p[i]==-1 && cap[a][i])
			{
				p[i]=a;
				int new_flow=min(b,cap[a][i]);
				if(i==t)
					return new_flow;
				q.push({i,new_flow});
			}
		}
	}
	return 0;
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		for(int i=0;i<=n+m;i++)
			g[i].clear();
		for(int i=1;i<=n;i++)
		{
			cin>>v[i];
			g[0].push_back(i);
			g[i].push_back(0);
			cap[0][i]=v[i];
		}
		for(int i=1;i<=m;i++)
		{
			cin>>k>>cap[n+i][n+m+1];
			g[n+i].push_back(n+m+1);
			g[n+m+1].push_back(n+i);
			for(int j=1;j<=k;j++)
			{
				cin>>u;
				g[u].push_back(n+i);
				g[n+i].push_back(u);
				cap[u][n+i]=v[u];
			}
		}
		int s=0,t=n+m+1,ans=0;
		while(int new_flow=nflow(s,t))
		{
			ans+=new_flow;
			int cur=t;
			while(cur!=s)
			{
				int prev=p[cur];
				cap[prev][cur]-=new_flow;
				cap[cur][prev]+=new_flow;
				cur=prev;
			}
		}
		cout<<ans<<'\n';
	}
	return 0;
}