Pagini recente » Cod sursa (job #443167) | Cod sursa (job #575784) | Cod sursa (job #2310268) | Cod sursa (job #2792782) | Cod sursa (job #1991100)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int nmax=205;
vector<int> v[nmax];
int fl[nmax][nmax],c[nmax][nmax],prec[nmax],q[nmax];
int n,m,i,j,source,sink,p,u,start,nod,minfl,flow,t,x;
bool bfs()
{
u=1;q[u]=source;
for(i=1;i<=sink;i++)
prec[i]=0;
prec[source]=-1;
for(p=1;p<=u;p++)
{
start=q[p];
for(i=0;i<v[start].size();i++)
{
nod=v[start][i];
if((!prec[nod])&&fl[start][nod]<c[start][nod])
{
prec[nod]=start;
u++;q[u]=nod;
if(nod==sink) return 1;
}
}
}
return 0;
}
int main()
{
ifstream f("tribut.in");
ofstream g("tribut.out");
f>>t;
for(int cnt=1;cnt<=t;cnt++)
{
f>>n>>m;flow=0;
source=n+m+1,sink=n+m+2;
for(i=1;i<=sink;i++)
{
for(j=1;j<=sink;j++)
fl[i][j]=c[i][j]=0;
v[i].clear();
}
for(i=1;i<=n;i++)
{
f>>c[source][i];
v[source].push_back(i);
}
for(i=1;i<=m;i++)
{
f>>p>>c[n+i][sink];
v[n+i].push_back(sink);
for(j=1;j<=p;j++)
{
f>>x;
c[x][n+i]=(1<<30);
v[x].push_back(n+i);
v[n+i].push_back(x);
}
}
while(bfs())
{
nod=sink;minfl=(1<<30);
while(nod!=source)
{
minfl=min(minfl,c[prec[nod]][nod]-fl[prec[nod]][nod]);
nod=prec[nod];
}
nod=sink;
while(nod!=source)
{
fl[prec[nod]][nod]+=minfl;
fl[nod][prec[nod]]-=minfl;
nod=prec[nod];
}
flow+=minfl;
}
g<<flow<<'\n';
}
return 0;
}