题意:给出n,有n种插座;给出m,表示有m种电器,给出电器名以及插头的类型;给出k,表示有k种转接器,给出可以桥接的插头和插座。 问说最少有多少个电器没有插座用。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include<set>
#include<climits>
using namespace std;
const int INF=1000000000;
const int maxn=500+10;
int cur;
int cap[maxn][maxn];
int n,m,k;
int flow[maxn][maxn];
int a[maxn];
int p[maxn];
int s,t;
int EK()
{
memset(flow,0,sizeof(flow));
int f=0;
for(;;)
{
memset(a,0,sizeof(a));
a[s]=INF;
queue<int> q;
q.push(0);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int v=0; v<=cur; ++v)
if(!a[v]&&flow[u][v]<cap[u][v])
{
a[v]=min(a[u],cap[u][v]-flow[u][v]);
p[v]=u;
q.push(v);
}
}
if(a[t]==0) break;
for(int u=t; u!=s; u=p[u])
{
flow[u][p[u]]-=a[t];
flow[p[u]][u]+=a[t];
}
f+=a[t];
}
return f;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(cap,0,sizeof(cap));
cur=1;
map<string,int> id;
char ss[30],ss2[30];
scanf("%d",&n);
for(int i=0; i<n; ++i)
{
scanf("%s",ss);
if(id[ss]==0)id[ss]=++cur;
cap[0][id[ss]]=1;
}
scanf("%d",&m);
for(int i=0; i<m; ++i)
{
scanf("%s%s",ss,ss2);
if(id[ss]==0)id[ss]=++cur;
if(id[ss2]==0)id[ss2]=++cur;
cap[id[ss]][1]=1;
cap[id[ss2]][id[ss]]=1;
}
scanf("%d",&k);
for(int i=0; i<k; ++i)
{
scanf("%s%s",ss,ss2);
if(id[ss]==0)id[ss]=++cur;
if(id[ss2]==0)id[ss2]=++cur;
cap[id[ss2]][id[ss]]=INF;
}
s=0;
t=1;
printf("%d\n",m-EK());
if(T)printf("\n");
}
return 0;
}