HDU2819 Swap(二分匹配+输出结果)

题意:

给一个n*n的01矩阵,问能否通过行列交换使得

主对角线上的数都为1

如果能输出交换的过程,如果不能输出-1

思路:

线性代数学过,行列交换都不改变矩阵的秩

三秩相等

如果能改变成主对角线上的数都为1

则原矩阵必为满秩

/* ***********************************************
//Author        :devil
//Created Time  :2016/5/10 21:49:26
//************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <stdlib.h>
using namespace std;
const int N=110;
vector<int>eg[N];
int link[N],a[N*N],b[N*N];
bool vis[N];
bool dfs(int u)
{
    for(int i=0;i<eg[u].size();i++)
    {
        int v=eg[u][i];
        if(!vis[v])
        {
            vis[v]=1;
            if(link[v]==-1||dfs(link[v]))
            {
                link[v]=u;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int n,x;
    while(~scanf("%d",&n))
    {
        memset(link,-1,sizeof(link));
        for(int i=1;i<=n;i++)
            eg[i].clear();
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&x);
                if(x) eg[i].push_back(j);
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            memset(vis,0,sizeof(vis));
            ans+=dfs(i);
        }
        if(ans<n)
        {
            printf("-1\n");
            continue;
        }
        int cnt=0,j;
        for(int i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
                if(link[j]==i) break;
            if(j!=i)
            {
                a[cnt]=i;
                b[cnt++]=j;
                swap(link[j],link[i]);
            }
        }
        printf("%d\n",cnt);
        for(int i=0;i<cnt;i++)
            printf("C %d %d\n",a[i],b[i]);
    }
    return 0;
}
时间: 2024-11-07 20:48:38

HDU2819 Swap(二分匹配+输出结果)的相关文章

HDU 2819 Swap (二分匹配+破输出)

题意:给定上一个01矩阵,让你变成一个对角全是 1 的矩阵. 析:二分匹配,把行和列看成两个集合,用匈牙利算法就可以解决,主要是在输出解,在比赛时一紧张不知道怎么输出了. 输出应该是要把 match[i] = i 这样的输出,然后再改掉后面那个,真是个大傻逼输出,气死了..... 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <strin

HDU 2819 — Swap 二分匹配

Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2174    Accepted Submission(s): 774Special Judge Problem Description Given an N*N matrix with each entry equal to 0 or 1. You can swap any tw

HDU 1507 Uncle Tom&#39;s Inherited Land*(二分匹配,输出任意一组解)

<p style="margin: 10px auto; line-height: 19.5px; font-size: 13px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: rgb(40, 85, 126);"> 要输出任意一组解.</p><p style="margin: 10px auto; line-height: 19.5p

kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树

二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 1.一个二分图中的最大匹配数等于这个图中的最小点覆盖数 König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选

HDU5943 Kingdom of Obsession(思路题+二分匹配)

题意: 给你两个数n,s(1e9),问你能否使得s+1--s+n和1--n全部匹配 每个数只能匹配他的因子 思路: 要匹配的这一段数中非重合部分最多有1个素数,也就是说n和s不能同时很大 我打了1e9的素数间隔表,发现最大间距才280多.. 然后索性直接当n和s都大于500的时候就输出no就可以了 符合条件的数非重合部分最多500个,二分匹配一下 /* *********************************************** Author :devil **********

hdoj 2063 过山车 【二分匹配之匈牙利算法】

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11520    Accepted Submission(s): 5072 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做pa

HDU 2063:过山车(二分匹配,匈牙利算法)

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9745    Accepted Submission(s): 4294 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做par

LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

#2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 N NN 个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的 N NN 个数中第 K KK 大的数字的最小值是多少. 输入格式 第一行给出三个整数

HDU - 3729 I&#39;m Telling the Truth(二分匹配)

题意:有n个人,每个人给出自己的名次区间,问最多有多少个人没撒谎,如果有多解,输出字典序最大的解. 分析: 1.因为字典序最大,所以从后往前分析. 2.假设后面的人没说谎,并将此作为已知条件,然后从后往前依次给每个人找到合适的名次,输出所有能找到合适名次的人即可. 3.假定给第i个人安排名次,第i+1~n个人名次已经安排好,假如第i个人想占的名次被第j个人所占,那就从第j个人可以占的名次中再找个合适的名次给j,然后把空出来的这个名次给i,如果i可以占的所有名次都被占且占领的人找不到其他可以占的名