tema:
给 n (héroes) m (monstruos) k (magia)
N A continuación se da cada héroe línea q puede matar al monstruo y especies de pequeñas cantidades de estos monstruo
Cada héroe sólo puede matar a un monstruo poción mágica puede hacer que el héroe un héroe desguace de un monstruo uso una botella de magia
El pensamiento un (bipartito coincidente gráfico):
En primer lugar sin el uso de RAN mágica sobre Hungría -> devuelve el número de héroe puede matar para conseguir monstruo (código Q)
Luego de cada matriz se ha podido salvar de [monstruo] = el que el héroe esta vez pitted más volver a Hungría -> En el caso de que el resto del héroe puede usar la magia de nuevo monstruo matar -> ajustes por héroe puede sólo una magia ! coincidente grafo bipartito, situación terrorista! (Ver Duero continente reciente aluvión de animación es "" situación terrorista ", raspador, que también heredó ja ja ja)
Nota QQ = min (k, puede continuar para matar al héroe);
ans = Q + Q;
códigos de CA (bipartito gráfico)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int MaxN = 505;
int n,m,k;
vector<int> G[MaxN];
bool used[MaxN];
int Size[MaxN],from[MaxN];
bool match(int x){
for(int i = 0;i < Size[x]; i++){
if(!used[G[x][i]]){
used[G[x][i]] = 1;
if(from[G[x][i]] == -1 || match(from[G[x][i]])){
from[G[x][i]] = x;
return 1;
}
}
}
return 0;
}
int hungry(){
int tot = 0;
for(int i = 1;i <= n; i++) Size[i] = G[i].size();
for(int i = 1;i <= n; i++){
for(int j = 1;j <= m; j++) used[j] = 0;
if(match(i)) ++tot;
}
return tot;
}
int main()
{
scanf("%d %d %d",&n,&m,&k);
for(int i = 1;i <= n; i++){
int q;
scanf("%d",&q);
for(int j = 1;j <= q; j++){
int cur;
scanf("%d",&cur);
G[i].push_back(cur);
}
}
for(int i = 1;i <= m; i++) from[i] = -1;
int Q = hungry();
int QQ = hungry();
printf("%d\n", Q + min(QQ, k));
}