Pagini recente » Cod sursa (job #3206144) | Cod sursa (job #2526820) | Cod sursa (job #1134093) | Cod sursa (job #35961) | Cod sursa (job #3042229)
Utilizator |
LXGA 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;
}