Swap---hdu2819(最大匹配)

题意:通过交换行或者列来实现对角线(左上角到右下角)上都是1,

首先,如果某行全是0或者某列全是0必然不满足情况输出-1,如果能转换的话,那么必然可以通过全由行(列)变换得到;

还有就是对角线上的N个1,它们各自在不同的行中出现至少一次才可以,

比如样例2中,虽然有两个1,但是它们总是处在同一列,仍然不满足要求,

很明显不能一个行对应两个列,或者说,每一行都应该有至少一个与自己对应的列才能满足条件;

那么将行作为X集合,列作为Y集合,如果map[i][j]==1,那么Xi->Yj连边,求最大匹配,这样的话没有任何一个行被两个列匹配,也就满足了我们的要求,

如果最大匹配==N,那么必然有解,否则必然无解;

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 110

int maps[N][N], vis[N], used[N], n, ans;
int a[10100], b[10100];
bool Find(int u)
{
    for(int i=1; i<=n; i++)
    {
        if(!vis[i] && maps[u][i])
        {
            vis[i] = 1;
            if(!used[i] || Find(used[i]))
            {
                used[i] = u;
                return true;
            }
        }
    }
    return false;
}

int main()
{
    while(scanf("%d", &n)!=EOF)
    {
        memset(used, 0, sizeof(used));
        memset(maps, 0, sizeof(maps));
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                scanf("%d", &maps[i][j]);
            }
        }
        int ans = 0;
        for(int i=1; i<=n; i++)
        {
            memset(vis, 0, sizeof(vis));
            if(Find(i))
                ans++;
        }
        if(ans<n)
        {
            printf("-1\n");
            continue;
        }
        int cnt = 0;
        for(int i=1; i<=n; i++)
        {
            while(used[i]!=i)
            {
                a[cnt] = i;
                b[cnt] = used[i];
                swap(used[a[cnt]], used[b[cnt]]);
                cnt++;
            }
        }
        printf("%d\n", cnt);
        for(int i=0; i<cnt; i++)
            printf("C %d %d\n", a[i], b[i]);
    }
    return 0;
}

时间: 2024-10-25 20:03:43

Swap---hdu2819(最大匹配)的相关文章

专题之匹配、网络流(一)

1.hdu 2444 The Accomodation of Students(判断二分图+最大匹配)(匈牙利模板) 题意:一共有n个学生,m对关系:A认识B.问能否将所有的人分成两批,每批之间的人都互相认识,如果可以,输出每批的人数.即判断是否为二分图,以及求二分图的最大匹配. 思路:判断是否为二分图(DFS或BFS):求二分图的最大匹配:匈牙利算法. 1 #include<iostream> 2 #include<queue> 3 using namespace std; 4

hdu1281+hdu2819(最大匹配数)

分析:将行和列缩点,即行对应二分图的X部,列对应二分图的Y部,然后交点为连接该行和该列的一条边.匹配时每点都会把整行整列占了,因此就不会出现冲突了. 传送门:hdu1281 棋盘游戏 #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <q

HDU2819(KB10-E 二分图最大匹配)

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

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

题意: 给一个n*n的01矩阵,问能否通过行列交换使得 主对角线上的数都为1 如果能输出交换的过程,如果不能输出-1 思路: 线性代数学过,行列交换都不改变矩阵的秩 三秩相等 如果能改变成主对角线上的数都为1 则原矩阵必为满秩 /* *********************************************** //Author :devil //Created Time :2016/5/10 21:49:26 //********************************

Swap(二分图的最大匹配)

Swap HDU - 2819 Given an N*N matrix with each entry equal to 0 or 1. You can swap any two rows or any two columns. Can you find a way to make all the diagonal entries equal to 1? InputThere are several test cases in the input. The first line of each

HDU-2819 Swap

这题也是异列异行问题,而且任意输出一个解即可... #include <cstdlib> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <fstream> #include <iostream> #define rep(i, l, r) for(int i=l; i<=r; i++) #defin

UOJ79 一般图最大匹配

题目描述 从前一个和谐的班级,所有人都是搞OI的.有 nn 个是男生,有 00 个是女生.男生编号分别为 1,-,n1,-,n. 现在老师想把他们分成若干个两人小组写动态仙人掌,一个人负责搬砖另一个人负责吐槽.每个人至多属于一个小组. 有若干个这样的条件:第 vv 个男生和第 uu 个男生愿意组成小组. 请问这个班级里最多产生多少个小组? 输入格式 第一行两个正整数,n,mn,m.保证 n≥2n≥2. 接下来 mm 行,每行两个整数 v,uv,u 表示第 vv 个男生和第 uu 个男生愿意组成小

POJ2584_T-Shirt Gumbo(二分图多重最大匹配/最大流)

解题报告 http://blog.csdn.net/juncoder/article/details/38239367 题目传送门 题意: X个參赛选手,每一个选手有衣服大小的范围,5种大小的队服,求能否使每一个选手都拿到符合自己大小范围的衣服. 思路: X人5种衣服,有的人选的衣服可能大小一样,这样就是二分图的多重最大匹配.源点到5种衣服的容量就是衣服的数量. #include <queue> #include <queue> #include <cstdio> #i

[HDOJ5943]Kingdom of Obsession(最大匹配,思路)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5943 题意:n个人编号为[s+1,s+n],有n个座位编号为[1,n],编号为i的人只能坐到编号为它的约数的座位,问每个人是否都有位置坐. 首先,可以肯定的是素数编号的人只能做到自己的编号上或者是1上,那么假如[s+1,s+n]区间内出现了两个以上的素数,那么整个情况是无解的. 其次,假如s<n的话,可以把[s+1,s+n]直接放到[s+1,s+n]上,剩下的将会是s个人和s个座位,人的编号是[n+

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