HDU 3729 I'm Telling the Truth(2010 Asia Tianjin Regional Contest )

来源:互联网 发布:彩票pk10开奖网源码 编辑:程序博客网 时间:2024/06/07 05:27

【题目链接】http://acm.hdu.edu.cn/showproblem.php?pid=3729

【解题报告】
做这场比赛的时候还不会二分图匹配,全场想构造贪心解法TAT。实际上如果会二分图匹配的话这道题目还是挺裸的。需要注意的是给出的x,y范围非常大,也就是图非常稀疏,用邻接矩阵不可避免会T的。所以我开了一个结构体用来存边集,实测62ms就过了。

【参考代码】

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxs=1e5+10;bool vis[maxs];int link[maxs],used[61];int n;struct node{      int x,y;}mp[61];bool DFS( int u ){    for( int i=mp[u].x; i<=mp[u].y; i++ )        if(  !vis[i] )        {              vis[i]=1;            if( link[i]==-1 || DFS( link[i] ) )            {                link[i]=u;                used[u]=1;                return true;            }        }    return false;}int main(){    int T; cin>>T;    while( T-- )    {        memset( link,-1,sizeof(link));        memset( used,0,sizeof(used));        scanf( "%d",&n );        for( int i=1; i<=n; i++ )        {            int x,y;            scanf("%d%d",&x,&y);            mp[i].x=x; mp[i].y=y;        }        int ans=0;        for( int i=n; i>=1; i-- )        {            memset( vis, 0, sizeof(vis) );            if( DFS(i) )ans++;        }        printf("%d\n",ans);        int tt=ans;        for( int i=1; i<=n; i++ )if(used[i])        {            tt--;            if(tt)printf("%d ",i );            else printf("%d\n",i);        }    }    return 0;}
0 0
原创粉丝点击