前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【I'm Telling the Truth】【HDU - 3729】 【匈牙利算法,DFS】

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

作者头像
_DIY
发布2019-08-23 19:37:17
3030
发布2019-08-23 19:37:17
举报

思路

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

AC代码

代码语言:javascript
复制
#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;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思路
  • AC代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档