第一轮C2组C题
题目:
输入输出:
样例:
【考察内容】匈牙利算法
【难度】简单
【题意】有一个只有0和1的矩阵,每次你可以交换某两行或某两列,问是否能使得主对角线全为1,如果能输出一种方案,否则输出-1
【思路】通过交换使得主对角线全为1,假设某一个矩阵是可以通过交换实现的,则该矩阵一定有n个1满足每个1的行与列是不同的,只有这样才能使该矩阵通过交换实现主对角线全为1,若存在这样的n个1,则必然满足行与列的最大匹配为n,若能找到这样的矩阵,通过只交换行或者只交换列即可
【实现代码】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100005;
int n,dp[N][15],num[N][15],a,b,tmp;
int main()
{
while(cin>>n)
{
if(!n) break;
tmp = 0;
memset(num,0,sizeof(num));
for(int i = 1;i <= n;i ++)
{
scanf("%d %d",&a,&b);
num[b][a] ++;
tmp = max(tmp,b);
}
for(int i = tmp;i >= 0;i --)
for(int j = 0;j <= 10;j ++)
num[i][j] += max(num[i + 1][j - 1],max(num[i + 1][j],num[i + 1][j + 1]));
cout<<num[0][5]<<'\n';
}
}
二分图最大匹配 :二分图最大匹配
最小点覆盖 :二分图最大匹配
最小边覆盖:(m + n) 减 二分图最大匹配
最大独立集:(m + n) 减 二分图最大匹配
【参考博客】https://blog.csdn.net/qq_38956769/article/details/80238896#%E4%BA%8C%E5%88%86%E5%9B%BE%E6%9C%80%E5%A4%A7%E5%8C%B9%E9%85%8D