HDU3729 I'm Telling the Truth(二分图最大匹配)

传送门

题目大意:有N个学生,老师询问每个学生的排名,每个学生都告诉了一个排名区间,求可能的最多的学生说实话的个数,以及那些学生的标号,有相同的则输出字典序最大的。

建模:对于每一个学生连上对应区间的每一个点,然后求最大匹配就行了。这里有一个优化,就是当某个学生给出的排名区间的范围大于N之后就可以不用加边了,因为他肯定是可以说真话的———–PS:不加这个优化也能过

给出代码


#include<cstdio>
#include<cstring>
#define MAXN 100
#define MAXM 110000
int n, a[MAXN], b[MAXN], c[MAXM], ans[MAXN], cnt;
bool ban[MAXN], vis[MAXM];
bool dfs(int u)
{
    vis[u] = 1;
    for(int i = a[u] + n; i <= b[u] + n; i ++)
    {
        if(vis[i]) continue;
        vis[i] = 1;
        if(!c[i] || dfs(c[i]))
        {
            c[u] = i;
            c[i] = u;
            return 1;
        }
    }
    return 0;
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T --)
    {
        cnt = 0;
        scanf("%d", &n);;
        for(int i = 1; i <= n; i ++)
        {
            scanf("%d%d", &a[i], &b[i]);
            ban[i] = ((b[i] - a[i]) < n);   //上文所说的优化
        }
        memset(c, 0, sizeof c);
        for(int i = n; i > 0; i --)
            if(!c[i])
            {
                if(ban[i])
                {
                    memset(vis, 0, sizeof vis);
                    if(dfs(i)) ans[++cnt] = i;
                }
                else ans[++cnt] = i;
            }
        printf("%d\n", cnt);
        for(int i = cnt; i > 1; i --)
            printf("%d ", ans[i]);
        printf("%d\n", ans[1]);
    }
    return 0;
}

版权声明:请随意转载O(∩_∩)O

HDU3729 I'm Telling the Truth(二分图最大匹配)

时间: 2024-10-29 09:50:59

HDU3729 I'm Telling the Truth(二分图最大匹配)的相关文章

HDU 3729 I&#39;m Telling the Truth(二分图最大匹配+结果输出)

题目地址:HDU 3729 二分图最大匹配+按字典序输出结果.只要从数字大的开始匹配就可以保证字典序最大了.群里有人问..就顺手写了这题.. 代码如下: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int vis[110000], head[110000], cnt, link[110000], n, a[

UVALive 5033 I&#39;m Telling the Truth 二分图最大匹配(略有修改)

I - I'm Telling the Truth Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVALive 5033 Description After this year's college-entrance exam, the teacher did a survey in his class on students' score. There

hdu3729 I&#39;m Telling the Truth (二分图的最大匹配)

http://acm.hdu.edu.cn/showproblem.php?pid=3729 I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1427    Accepted Submission(s): 719 Problem Description After this year’s col

HDOJ题目3729 I&#39;m Telling the Truth(二分图)

I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1629    Accepted Submission(s): 805 Problem Description After this year's college-entrance exam, the teacher did a survey i

hdu 3729(二分图最大匹配)

I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2006    Accepted Submission(s): 1011 Problem Description After this year’s college-entrance exam, the teacher did a survey i

匈牙利算法dfs模板 [二分图][二分图最大匹配]

最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs 于是用到了dfs模板 寻找二分图最大匹配的算法是匈牙利算法 匈牙利算法的主要程序是寻找增广路 寻找增光路是过程是:从一个未经配对的点出发,历经未配边.匹配边.未配边.匹配边.未配边....最终到达一个未配点的过程,只要把路径中的未配边和匹配边的“身份”对调,匹配就加一了.这就是一个寻找增广路的过程,通过不断寻找增广路,可以找到最大的匹配. 1 #include<cstdio> 2 #include<cstring&g

图论——LCA、强联通分量、桥、割顶、二分图最大匹配、网络流

A: 交通运输线 时间限制: 5 Sec  内存限制: 128 MB 题目描述 战后有很多城市被严重破坏,我们需要重建城市.然而,有些建设材料只能在某些地方产生.因此,我们必须通过城市交通,来运送这些材料的城市.由于大部分道路已经在战争期间完全遭到破坏,可能有两个城市之间没有道路.当然在运输线中,更不可能存在圈. 现在,你的任务来了.给你战后的道路情况,我们想知道,两个城市之间是否存在道路,如果存在,输出这两个城市之间的最短路径长度. 输入 第一行一个整数Case(Case<=10)表示测试数据

POJ 2226二分图最大匹配

匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. #include<stdio.h> #include<string.h> #include<stdlib.h> int n1,n2; char map[1005][1005]; //数组开大点 int mapx[1005][1005],mapy[1005]

【Codevs1922】骑士共存问题(最小割,二分图最大匹配)

题意: 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑士,使得它们彼此互不攻击. n<=200,m<=n^2 思路:经典的二分图最大匹配问题,采用黑白点染色的思想. 如果按照相邻点黑白不同染色,可以发现每次跳到的点必定与现在所在点不同色,二分图最大匹配即可. 这里用最小割来解决,因为不能允许任何黑白点之间的任何一条边有流量,符合最小割的思想. 1