POJ 1486 Sorting Slides

本文探讨了一种涉及幻灯片与数字坐标匹配的问题,并提供了一个具体的错误示例程序。该程序试图通过拓扑排序来解决幻灯片与数字间的对应关系,但存在缺陷。正确的解决方案可能涉及使用二分匹配算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:一些幻灯片,有一些数字在幻灯片里面,看能不能一个数字对应一张幻灯片
第一行代表有几张幻灯片
给出这几张幻灯片的坐标


接着n行代表1-n个数字对应的坐标
然后要求你打印一个确定的使一个数字对应一张幻灯片
如果不能对应输出none

可以的话就按ABCD..这样顺序打印出来


错误的拓扑排序程序 如下:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<vector>
#include<algorithm>
using namespace std;

struct Nod
{
    int in;
}dian[105];



struct Node
{
    int x1,x2,y1,y2;
}mapp[105];

struct Pa
{
    int from,to;
};

int ans[105];
int flag[105];


int main()
{
    int n,x,y;
    int tot=0,count;

    while(~scanf("%d",&n) && n)
    {
        memset(dian,0,sizeof(dian));
        memset(ans,0,sizeof(ans));
        memset(flag,0,sizeof(flag));

        vector<int>nxt[205];

        for(int i=0;i<n;i++)
        {
            scanf("%d%d%d%d",&mapp[i].x1,&mapp[i].x2,&mapp[i].y1,&mapp[i].y2);
        }

        for(int i=0;i<n;i++)  //数字
        {
            scanf("%d%d",&x,&y);
            for(int j=0;j<n;j++) // 大写字母
                if(x>=mapp[j].x1 && x<=mapp[j].x2 && y>=mapp[j].y1 && y<=mapp[j].y2)
                {
                 //   dian[j].out++;
                    dian[i+n].in++;
                    nxt[j].push_back(i+n);
                }
        }

     //   for(int i=0;i<n;i++)
       //     printf("%d : %d\n",i+1,dian[i+n].in);

        //
        count=0;
        stack<struct Pa>Q;

        for(int i=0;i<n;i++)
            if(!flag[i])
            for(int j=0;j<nxt[i].size();j++)
                if( dian[nxt[i][j]].in==1)
                {
                    struct Pa nw;
                    nw.from=i;
                    nw.to=nxt[i][j];
                  //  flag[i]=1;
                    Q.push(nw);
                }

        while(!Q.empty())
        {
            struct Pa now=Q.top();
            Q.pop();

            int f,t;
            f=now.from;
            t=now.to;

            ans[f]=t;
            count++;   //记录结果的个数
            printf("*%c %d\n",f+'A',t-n+1);
            flag[f]=1;  //大写字母的点去掉
            for(int i=0;i<nxt[f].size();i++)
                dian[nxt[f][i]].in--;


            //栈中加入新的元素
            for(int i=0;i<n;i++)
            if(!flag[i])
            for(int j=0;j<nxt[i].size();j++)
                if( dian[nxt[i][j]].in==1)
                {
                    struct Pa nw;
                    nw.from=i;
                    nw.to=nxt[i][j];
                  //  flag[i]=1;
                    Q.push(nw);
                }

        }

        printf("Heap %d\n",++tot);
        printf("count=%d\n",count);
        if(count)
        {
            for(int i=0;i<n;i++)
                if(ans[i])
                printf("(%c,%d) ",i+'A',ans[i]-n+1);
            puts("");
        }else puts("none");

        puts("");

    }


    return 0;
}

求大神告诉我正确的 拓扑方法- -!

据说用二分匹配来下,waiting~~~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值