HDU 3729I'm Telling the Truth

本文通过解决一道具体的题目,介绍了如何运用离散化处理和匈牙利算法实现最大匹配,并分享了从TLE到AC的心路历程及代码实现。

这道题的题意就不解释了,建图比较抽象,刚开始时按照常规建图,结果就TLE了,然后想着离散化,最后得到的结果还是wrong,上网看了一下别人的构思,之后在原有的基础上改改就AC了。

以下是我的代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
using namespace std;
const int N=106000;
int n1,n2;
bool vis[N];
int llink[N];
struct node {
    int st;
    int ed;
};
node point[100];
int n;
stack<int >p;
int find(int x) {
    int i;
    for(i=point[x].st; i<=point[x].ed; i++) {
        if(!vis[i]) {
            vis[i]=true;
            if(llink[i]==-1||find(llink[i])) {
                llink[i]=x;
                return true;
            }
        }
    }
    return false;
}


int mach() {
    int ans=0;
    memset(llink,-1,sizeof(llink));
    for(int i=n; i>=1; i--) {
        memset(vis,false,sizeof(vis));
        if(find(i)) {
            p.push(i);
            ans++;
        }
    }
    return ans;
}






int main() {
    int T;
    int x,y;
    bool temp[N];
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&n);
        for(int i=1; i<=n; i++) {
            scanf("%d%d",&point[i].st,&point[i].ed);
        }
        int ans=mach();
        printf("%d\n",ans);
        if(ans==0) {
            continue;
        }
        printf("%d",p.top());
        p.pop();
        while(!p.empty()) {
            printf(" %d",p.top());
            p.pop();
        }
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值