64,687
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <string>
#include <cstring>
#define MAX 500
using namespace std;
int pnum;//插头数
int dnum; //设备数
int anum; //适配器数
string plug[MAX]; //存储插头型号
string type[MAX]; //设备插头型号
string dev[MAX]; //设备名字
string inadapt[MAX]; //需要的型号
string outadapt[MAX]; //适配的型号
bool map[MAX][MAX]; //二分矩阵
bool state[MAX];
bool flag[MAX]; //匹配插头时的标记
int res[MAX]; //匹配结果
void DFS(string type, int j, int d)
{
int i,k;
string temp;
for(i = 0; i< anum; i++)
if(type == outadapt[i] && flag[j] == true)
{
flag[i] = false;
DFS(inadapt[i], i,d);
}
temp= inadapt[j];
for(k = 0; k< pnum; k++)
{
if(temp == plug[k])
map[d][k] = true;
}
}
bool find(int i)
{
int j;
for(j = 0; j< dnum; j++)
if(map[i][j] == true && state[j] == false)
{
state[j] = true;
if(res[j] == -1 || find(res[j]) == true)
{
res[j] = i;
return true;
}
}
return false;
}
int main()
{
int n,p1=1;
cin>>n;
while(n--)
{
if(p1)
p1=0;
else
printf("\n");
int i,j,match;
string temp;
memset(map, false, sizeof(map));
for(i=0 ;i< MAX; i++)
res[i] = -1;
cin>>pnum;
for(i=0; i<pnum; i++) //输入插头型号
cin>>plug[i];
cin>>dnum;
for(i=0; i<dnum; i++) //输入设备名字和设备所需的插头型号
cin>>dev[i]>>type[i];
cin>>anum;
for(i=0; i<anum; i++) //输入适配器的适配型号,和所需的型号
cin>>outadapt[i]>>inadapt[i];
///////////////////////////////////////////////////////////////////////////////////////
for(i = 0; i<dnum; i++)
for(j = 0; j< anum; j++)
if(type[i] == outadapt[j])
{
memset(flag, true, sizeof(flag));
DFS(inadapt[j],j,i);
}
for(i=0; i<dnum; i++)
for(j=0; j< pnum; j++)
if(type[i] == plug[j])
map[i][j] = true;
match = 0;
/////////////////////////////////////// 匈牙利算法
for(i = 1; i<=pnum; i++)
{
memset(state, false , sizeof(state));
if(find(i))
match++;
}
cout<<dnum-match<<endl;
}
return 0;
}
#include <iostream>
#include <string>
#include <cstring>
#define MAX 500
using namespace std;
int pnum;//插头数
int dnum; //设备数
int anum; //适配器数
string plug[MAX]; //存储插头型号
string type[MAX]; //设备插头型号
string dev[MAX]; //设备名字
string inadapt[MAX]; //需要的型号
string outadapt[MAX]; //适配的型号
bool map[MAX][MAX]; //二分矩阵
bool state[MAX];
bool flag[MAX]; //匹配插头时的标记
int res[MAX]; //匹配结果
void DFS(string type, int j, int d)
{
int i,k;
string temp;
for(i = 0; i< anum; i++)
if(type == outadapt[i] && flag[i] == true)
{
flag[i] = false;
temp= inadapt[i];
for(k = 0; k< pnum; k++)
{
if(temp == plug[k])
map[d][k] = true;
}
DFS(inadapt[i], i,d);
}
}
bool find(int i)
{
int j;
for(j = 0; j< pnum; j++)
if(map[i][j] == true && state[j] == false)
{
state[j] = true;
if(res[j] == -1 || find(res[j]) == true)
{
res[j] = i;
return true;
}
}
return false;
}
int main()
{
int n,p1=1;
cin>>n;
while(n--)
{
if(p1)
p1=0;
else
printf("\n");
int i,j,match;
string temp;
memset(map, false, sizeof(map));
for(i=0 ;i< MAX; i++)
res[i] = -1;
cin>>pnum;
for(i=0; i<pnum; i++) //输入插头型号
cin>>plug[i];
cin>>dnum;
for(i=0; i<dnum; i++) //输入设备名字和设备所需的插头型号
cin>>dev[i]>>type[i];
cin>>anum;
for(i=0; i<anum; i++) //输入适配器的适配型号,和所需的型号
cin>>outadapt[i]>>inadapt[i];
///////////////////////////////////////////////////////////////////////////////////////
for(i = 0; i<dnum; i++)
for(j = 0; j< anum; j++)
if(type[i] == outadapt[j])
{
memset(flag, true, sizeof(flag));
DFS(outadapt[j],j,i);
}
for(i=0; i<dnum; i++)
for(j=0; j< pnum; j++)
if(type[i] == plug[j])
map[i][j] = true;
match = 0;
/////////////////////////////////////// 匈牙利算法
for(i = 0; i<dnum; i++)
{
memset(state, false , sizeof(state));
if(find(i))
match++;
}
cout<<dnum-match<<endl;
}
return 0;
}