我现在内心几乎是崩溃的,写了好久,都没过,在讨论区发现 一个思想跟我一模一样的,甚至连其中有些变量都跟我一样的代码
我一路狂找不同,发现都差不多啊,作用都是一样的,发现交上去就是错,然后灵光一闪用G++交上去.....A了C++交WA
简单的二分匹配,找出最大匹配,然后枚举每个点是否能被替代,简单模板题目
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
int num1[150];int num2[150];
int m,n;bool mapp[150][150];
int used[150];int pipei[150];
int target[150][150];
bool dfs(int han)
{
int i;
for(i=1;i<=n;i++)
{
if(used[i])
continue;
if(!mapp[han][i])
continue;
used[i]=1;
if(pipei[i]==-1||dfs(pipei[i]))
{
pipei[i]=han;
return true;
}
}
return false;
}
int main()
{
int k,i;
int ok=0;
while(scanf("%d%d%d",&m,&n,&k)!=EOF)
{
ok+=1;
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
memset(pipei,-1,sizeof(pipei));
memset(mapp,false,sizeof(mapp));
for(i=0;i<k;i++)
{
scanf("%d%d",&num1[i],&num2[i]);
mapp[num1[i]][num2[i]]=true;
}
int sum=0;
int los=0;
for(i=1;i<=m;i++)
{
memset(used,0,sizeof(used));
if(dfs(i))
sum++;
}
int j;
int sum2=0;
for(i=0;i<k;i++)
{
mapp[num1[i]][num2[i]]=false;
memset(pipei,-1,sizeof(pipei));
for(j=1;j<=m;j++)
{
memset(used,0,sizeof(used));
if(dfs(j))
sum2++;
}
if(sum2!=sum)
los++;
sum2=0;
mapp[num1[i]][num2[i]]=true;
}
printf("Board %d have %d important blanks for %d chessmen.\n",ok,los,sum);
}
return 0;
}