map没有清空,debug了一晚上。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<set>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<sstream>
#define LL long long
#define OJ_PRINT 0
#define READ_FILE 0
using namespace std;
const int NN_MAX = 210;
const int MM_MAX = 110;
const int INF = 0x1fffffff;
struct Edge{
int from,to,cap;
Edge (int a1=0,int b1=0,int c1=0):from(a1),to(b1),cap(c1) {}
};
/**********************************************************/
int n,m,k,id;
map<string,int>socketID,plugID;
bool isConn[NN_MAX*4][NN_MAX*4];
int target[NN_MAX*4],device[NN_MAX*4];
int cap[NN_MAX*4][NN_MAX*4],d[NN_MAX*4],p[NN_MAX*4];
//int flow[NN_MAX*4][NN_MAX*4];
Edge theEdge[NN_MAX];
int s,t,sum;
/**********************************************************/
int min_2 (int x,int y) {return x<y?x:y;}
int max_2 (int x,int y) {return x>y?x:y;}
void EK ();
void initEdge ();
void floyd ();
/**********************************************************/
int main()
{
if (READ_FILE) freopen ("in.txt","r",stdin);
int tt;
cin>>tt;
while (tt--)
{
string s1,s2;
socketID.clear ();plugID.clear ();
id=0;
cin>>n;
for (int i = 0; i < n; i++){
cin>>s1;
if (socketID.count (s1)==0) socketID[s1]=id++;
target[i]=socketID[s1];
}
cin>>m;
for (int i = 0; i < m; i++){
cin>>s1>>s2;
if (socketID.count (s2)==0) socketID[s2]=id++;
plugID[s1]=socketID[s2];
device[i]=plugID[s1];
}
memset (isConn,0,sizeof (isConn));
cin>>k;
for (int i = 0; i < k; i++){
cin>>s1>>s2;
if (socketID.count (s1)==0) socketID[s1]=id++;
if (socketID.count (s2)==0) socketID[s2]=id++;
isConn[socketID[s1]][socketID[s2]]=1;
}
for (int i=0;i<id;i++) isConn[i][i]=1;
floyd ();
if (OJ_PRINT){
for (int i = 0; i < id; i++)
for (int j = 0; j < id; j++)
if (isConn[i][j])
cout<<i<<" "<<j<<endl;
}
s=0;t=n+m+1;
initEdge ();
sum=0;
EK ();
if (tt) cout<<endl;
}
return 0;
}
void floyd ()
{
for (int l=0;l<id;l++)
for (int i=0;i<id;i++)
for (int j=0;j<id;j++)
isConn[i][j]=isConn[i][j]||(isConn[i][l]&&isConn[l][j]);
}
void initEdge ()
{
memset (cap,0,sizeof (cap));
//memset (flow,0,sizeof (flow));
for (int i=1;i<=m;i++){
cap[s][i]=1;
}
for (int i=m+1;i<=n+m;i++){
cap[i][t]=1;
}
for (int i=0;i<m;i++)
for (int j=m;j<n+m;j++)
if (isConn[device[i]][target[j-m]]){
cap[i+1][j+1]=INF;
}
}
void EK ()
{
queue<int>qee;
int mn=n+m+1;
while (1)
{
for (int i=0;i<=mn;i++) d[i]=0;
d[s]=INF;
qee.push (s);
while (!qee.empty ())
{
int x=qee.front ();qee.pop ();
for (int y=0;y<=mn;y++){
if (!d[y] && cap[x][y]>0){
p[y]=x;
qee.push (y);
d[y]=min_2 (d[x],cap[x][y]);
}
}
}
if (d[t]==0) break;
sum+=d[t];
for (int i=t;i!=s;i=p[i]){
cap[p[i]][i]-=d[t];
cap[i][p[i]]+=d[t];
}
}
printf ("%d\n",m-sum);
}