HDU 1498 50 years, 50 colors(二分最大匹配之最小点覆盖)

题目地址:HDU 1498

晕啊。。。三个人同时做的这个题,结果全都理解错意思了。。而且每个人理解错的地方还都不一样。。但是样例还都能过,。。。简直炫酷。。。

题意:n*n的矩阵放置不同的颜色(不同的数字代表不同的颜色),你有k次选择,每一次只能选择某一行或某一列,可以消除该行(列)的所有颜色,问有哪几种颜色,无论怎样经过k次选择后依然无法完全抹去。

这个题的思路就是分别求出每种颜色的最少操作次数。然后只要大于k次的就是不符合要求的。然后输出就行了。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
int link[200], vis[200], cnt, head[200], n, m, mp[200][200];
struct node
{
    int u, v, next;
}edge[100000];
void add(int u, int v)
{
    edge[cnt].v=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
int dfs(int u)
{
    int i;
    for(i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].v;
        if(!vis[v])
        {
            vis[v]=1;
            if(link[v]==-1||dfs(link[v]))
            {
                link[v]=u;
                return 1;
            }
        }
    }
    return 0;
}
int hungary()
{
    int i, ans=0;
    memset(link,-1,sizeof(link));
    for(i=0;i<n;i++)
    {
        memset(vis,0,sizeof(vis));
        ans+=dfs(i);
    }
    //printf("%d\n",ans);
    return ans;
}
int main()
{
    int k, i, j, h, s, _hash[200], Q[200];
    while(scanf("%d%d",&n,&k)!=EOF&&n&&k)
    {
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&mp[i][j]);
            }
        }
        int tot=0;
        for(h=1;h<=50;h++)
        {
            memset(head,-1,sizeof(head));
            cnt=0;
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                    if(mp[i][j]==h)
                    {
                        add(i,j);
                    }
                }
            }
            int ans=hungary();
            if(ans>k)
            {
                Q[tot++]=h;
            }
        }
        if(tot==0)
            printf("-1\n");
        else
        {
            for(i=0;i<tot-1;i++)
            {
                printf("%d ",Q[i]);
            }
            printf("%d\n",Q[tot-1]);
        }
    }
    return 0;
}

HDU 1498 50 years, 50 colors(二分最大匹配之最小点覆盖)

时间: 2024-10-12 20:52:25

HDU 1498 50 years, 50 colors(二分最大匹配之最小点覆盖)的相关文章

关于最大匹配,最小点覆盖,最少路径覆盖和最大独立集的总结

(1)二分图的最大匹配 匈牙利算法 (2)二分图的最小点覆盖 二分图的最小点覆盖=二分图的最大匹配 求最小点覆盖:从右边所有没有匹配过的点出发,按照增广路的“交替出现”的要求DFS.最终右边没有访问过的点和左边访问过的点组成最小点覆盖. 证明见这里 (3)二分图的最少边覆盖 二分图的最少边覆盖=点数-二分图的最大匹配 证明: 先贪心选一组最大匹配的边放进集合,对于剩下的没有匹配的点,随便选一条与之关联的边放进集合,那么得到的集合就是最小边覆盖. 所以有:最小边覆盖=最大匹配+点数-2*最大匹配=

HDU149850 years, 50 colors(行列匹配+最小点覆盖)

题意:给出一个n*n的矩阵,里面的数字代表气球的颜色,你每次可以一行或者一列里的相同的某一颜色气球,并把它们全部打破,你一共有k次机会,问最后不能被某一位学生在k次操作里打破的气球,按字典序升序输出,没有的话输出-1 思路:我们反过来想,能被学生在K次里打破的话,那么这些气球的分布行列数必然不大于K,我们就以某一色气球的 X,Y建立二分图 ,X,Y对应二分图的左右两边,我们肯定是要选择最少点来覆盖所有的边,最小点覆盖就是最大匹配,然后枚举所有颜色的点即可 #include<iostream>

HDU1150 Machine Schedule(二分图最大匹配、最小点覆盖)

As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduling problems differ widely in the nature of the constraints that must be satisfied and the type of schedule desire

uva 11419 最大匹配(最小点覆盖)

链接:https://vjudge.net/problem/27475 题意:给定一个二维矩阵,在一些格子里放置了东西,然后你有一门炮,每次能横向或纵向开一炮,将这一行所有的东西摧毁.问你最少花多少炮弹摧毁所有的东西?并输出一组解. 题解: 很久之前做的题目了,今天在看到的时候还是很有新的体会的.这是一个求最小覆盖的问题,最小点覆盖,将行列的每个点看作是x,y集合,将放置的东西的地方看作是边(大白书).然后求一次最大匹配,会得出来至少有多个点是不在同一行和同一列的,这样剩余的东西就会与原来的已匹

poj 3041Asteroids 二分匹配求最小点覆盖模板题

//最大匹配=最小覆盖 //这题是求最小覆盖点的模板题 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 510; int line[maxn][maxn]; int match[maxn]; int vis[maxn]; int N , K; int find(int start) { for(int i = 1;i <=  N;

Asteroids(二分匹配_最小点覆盖)

Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K asteroids (1 <= K <= 10,000), which are conveniently located at the lattice points of the

poj2226Muddy Fields 二分匹配之最小点覆盖

//给r*c的 field ,有的地方有水,用宽度为1,长度任意的木板将这些有水的地方, //遮住,木板可以相互叠加,木板不能遮住有草的地方 //可以每行中的连续的格子看成一个点xi,每一列中连续的格子看成一个点yj //将每一个有水的格子看成一条边连接对应的xi , yj //那么其最小点覆盖即为答案 #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const in

hdu 1498 50 years, 50 colors 二分匹配

50 years, 50 colors Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1789    Accepted Submission(s): 978 Problem Description On Octorber 21st, HDU 50-year-celebration, 50-color balloons floating

hdu 1498 50 years, 50 colors(二分匹配_匈牙利算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1498 50 years, 50 colors Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1918    Accepted Submission(s): 1058 Problem Description On Octorber 21st,