2011.08.06

POJ 1486 Sorting Slides

        题意:有一堆透明的堆叠的幻灯片,记为A,B,C…给出每张幻灯片的坐标范围,以及每个幻灯片上有其序号1,2,3…给出这个序号的坐标。问最多能确定哪几张幻灯片的序号。

        解法:即求最大匹配的必须边。从每一张包含某序号坐标的幻灯片字母标记,向序号连一条边,构成二分图。求出最大匹配,然后每次删除最大匹配中的一条边后求最大匹配,最大匹配数发生改变的充要条件是删除了必须边,用这个方法判别必须边与非必须边,按字典序输出即可。

#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
struct abc
{
    int x1,x2,y1,y2;
}let[30];
int g[60][60],links[60],b[60],m,n,t,ans,now;
string s[6000];
bool find(int a)
{
    for(int i=1;i<=n;i++)
        if(g[a][i]==1 && !b[i]){
            b[i]=1;
            if(links[i]==0 || find(links[i])){
                links[i]=a;
                return true;
            }
        }
    return false;
}
int main()
{
    int i,j,k,x,y;
    while(1){
        scanf("%d",&n);
        if(n==0) break;
        pair<int ,int> q[100000];
        t++;ans=0;
        int l=1,r=1;
        memset(q,0,sizeof(q));
        memset(g,0,sizeof(g));
        memset(links,0,sizeof(links));
        printf("Heap %d\n",t);
        for(i=1;i<=n;i++)
            scanf("%d%d%d%d",&let[i].x1,&let[i].x2,&let[i].y1,&let[i].y2);
        for(i=1;i<=n;i++){
            scanf("%d%d",&x,&y);
            for(j=1;j<=n;j++)
                if(x<=let[j].x2 && x>=let[j].x1 && y>=let[j].y1 && y<=let[j].y2)
                    g[i][j]=1;
        }
        for(i=1;i<=n;i++){
            memset(b,0,sizeof(b));
            if(find(i))ans++;
        }
        for(i=1;i<=n;i++)
            q[r++]=make_pair(i,links[i]);
        for(;l<r;l++){
            int x=q[l].first,y=q[l].second;
            memset(links,0,sizeof(links));
            g[y][x]=0;now=0;
            for(j=1;j<=n;j++){
                memset(b,0,sizeof(b));
                if(find(j)) now++;
            }
            if(now==ans)
                q[l].first=q[l].second=0;
            g[y][x]=1;
        }
        j=0;
        for(i=1;i<r;i++)if(q[i].first>0)
            ++j;
        if(j==0){
            printf("none\n\n");
            continue;
        }
        l=1;
        for(i=1;l<j;i++)if(q[i].first>0){
            printf("(%c,%d) ",q[i].first+'A'-1,q[i].second);
            l++;
        }
        while(q[i].first==0) i++;
        printf("(%c,%d)\n\n",q[i].first+'A'-1,q[i].second);
    }
    return 0;
}

         输出写的太怂了这次…有个家伙很吵的在后面一直说话所以有点凌乱哈~输出错卡了我三个小时,实在是弱爆了呢~不过也因此把匈牙利看了个清清楚楚面目可憎…(误)


        唔,实在调不出来了这题就不调了,明天早上要上课,睡觉去吧……

        最近毫无状态啊,一直没找到原因,今天说出口,才知道潜意识里早就觉得没希望了吧…出去什么的,是白日梦吧…我一直是真么软弱的,从意志到力量…今天终于说出要放弃的话,心里竟然有一丝的释然和解脱,一点都不像我了呢~

        或许在失去那些花儿的时候,我就已经改变了吧,又或许是在那之前,所以才失去的那些花儿呢?默认结局然后宽慰自己,欺骗自己,我是从什么时候开始玩这种很没意思的游戏呢~什么时候,到底是什么时候…那种感觉就像是一种病,我变得麻木和迟疑,看似坚强其实无可依托,表面平静其实不安惶惑。不如意之事虽也多,身体却被浮华的光晕纠缠包裹,静静的城市,静静的灯火,静静的槐影婆娑,静静的蚁群奔涌,静静的坠落,静静的等待钝痛,深深的困倦和无力,对危机的感知趋于虚无。“已经这样了,还有什么能更差吗?”这种想法在每一个警觉的瞬间麻痹我,啃噬我,彻骨的冰冷和绝望侵入身体,为何三业之火不起,焚尽这个世界和我?


        人和人之间巨大的差距,真的只是平时的一点点。有时候我会这么想。

          One more time.

          One more chance.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值