【I'm Telling the Truth】【HDU - 3729】 【匈牙利算法,DFS】

思路

题意:该题主要说几个同学分别说出自己的名次所处区间,最后输出可能存在的未说谎的人数及对应的学生编号,而且要求字典序最大。
思路:刚刚接触匈牙利算法,了解的还不太清楚,附一个专门讲解匈牙利算法的博文,个人认为讲的比较清晰。

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int T, n;
struct Stue
{
    int l, r;
};
Stue per[60+10];
int vis[100000+10];         //判断该点是否访问过
int hon[60+10];             //用于记录未说谎的人的编号
int ok[100000+10];          //标记某点存在的学生编号,未有则默认为-1
bool dfs(int x)
{
    if(x < 0)
        return false;
    for(int i = per[x].l; i <= per[x].r; i++)
    {
        if(!vis[i])
        {
            vis[i] = 1;
            if(ok[i] == -1 || dfs(ok[i]))
            {
                ok[i] = x;
                return true;
            }
        }
    }
    return false;
}
int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    cin >> T;
    while(T--)
    {
        cin >> n;
        for(int i = 0; i < n; i++)
            cin >> per[i].l >> per[i].r;
        int cnt = 0;
        memset(hon, 0, sizeof(hon));
        memset(ok, -1, sizeof(ok));
        for(int i = n - 1; i >= 0; i--)         //从后往前,这样可以保证字典序最大
        {
            memset(vis, 0, sizeof(vis));
            if(dfs(i))
                hon[cnt++] = i;
        }
        cout << cnt << endl;
        if(!cnt)
            continue;
        for(int i = cnt - 1; i > 0; i--)
            cout << hon[i] + 1 << " ";
        cout << hon[0] + 1 << endl;
    }
}

【I'm Telling the Truth】【HDU - 3729】 【匈牙利算法,DFS】

原文地址:https://www.cnblogs.com/KeepZ/p/11370841.html

时间: 2024-12-07 20:04:40

【I'm Telling the Truth】【HDU - 3729】 【匈牙利算法,DFS】的相关文章

(匈牙利算法DFS)hdu 3729

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

hdu 2441 匈牙利算法求最大独立集

匈牙利算法 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 int n,m,t; 9 int vis[1002],link[1002],line[1002][1002]; 10 bool find(i

hdu 1083 匈牙利算法模板题

题意:有p个课程,n个学生,每个课程有x个学生喜欢.如果每个课程都至少可以分配一个学生就输出YES,否则输出NO. 题解:匈牙利算法裸题. 代码: #include <cstdio>#include <cstring>#define N 400int Map[N][N],S[N],vis[N],n;bool dfs(int u){    for(int i=1;i<=n;i++){        if(Map[u][i]&&!vis[i]){         

hdu 1281 匈牙利算法

棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4272    Accepted Submission(s): 2515 Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格

hdu 2063 匈牙利算法模板题

题意:有x个男生各自有喜欢的女生,y个女生各自有喜欢的男生.互相喜欢的在一起有好感度.问怎样好感度最高. 题解:匈牙利算法裸题. 代码: #include <cstdio>#include <cstring>#define N 1500int Map[N][N],M[N],vis[N];int k,m,n;bool dfs(int u){    for(int i=1;i<=n;i++){        if(Map[u][i]&&!vis[i]){     

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

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

HDU 2063 (匈牙利算法) 过山车

有m个妹子和n男生,男生和女生之间互相有好感则连一条线,问最多能撮合出多少对 这篇博文写的很好,没有让人望而生畏的图论术语 http://blog.csdn.net/dark_scope/article/details/8880547 核心思想就是一个“腾”字,没有妹子了不要紧,让前面的哥们换一个心仪的妹子,看看能否把自己心仪的妹子“腾”出来 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include

【bzoj4806~bzoj4809】 象棋四连发 DP-高精度-匈牙利算法-dfs

都是经典题了吧..我好无聊.. 4806 4806-1801是双倍经验..DP方程看代码吧.. 1 /* http://www.cnblogs.com/karl07/ */ 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 #include <algorithm> 7 using namespace std; 8 9 #define

二分图最大匹配(匈牙利算法Dfs模板)

#include<iostream> #include<cstdio> #include<cstring> #define maxn 2020 using namespace std; int n,m,g[maxn][maxn],ans,f[maxn],match[maxn]; int init() { int x=0;char s;s=getchar(); while(s<'0'||s>'9')s=getchar(); while(s>='0'&am

[图论] 二分图匹配(匈牙利算法)

介绍部分转载于维基百科: 匈牙利算法是众多用于解决线性任务分配问题的算法之一,是用来解决二分图最大匹配问题的经典算法,可以在多项式时间内解决问题,由美国数学家Harold Kuhn 于1955年提出.此算法之所以被称作匈牙利算法是因为算法很大一部分是基于以前匈牙利数学家Dénes K?nig和Jen? Egerváry的工作之上创建起来的. 问题简介: 设G=(V,E)是一个无向图.如顶点集V可分区为两个互不相交的子集V1,V2之并,并且图中每条边依附的两个顶点都分属于这两个不同的子集.则称图G