烦人的幻灯片(拓扑)

Page 527

出现的 大 错误:ans[ ] 内的数不是一个一个挨着放进去的 !而是按照扫到的范围的顺序放进去

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string> 
#include<algorithm>
using namespace std;
int n;
struct H{
    int x1,x2,y1,y2;
}card[30];
struct K{
    int x,y;
}f[30]; 
int tree[30][30],r[30],ans[30],tree2[30][30];
bool p[30];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d%d",&card[i].x1,&card[i].x2,&card[i].y1,&card[i].y2);
    }

    for(int i=1;i<=n;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        f[i].x=a,f[i].y=b;
        for(int j=1;j<=n;j++) 
        {
            if(a>=card[j].x1&&a<=card[j].x2&&b<=card[j].y2&&b>=card[j].y1)
            {
                tree[i][++tree[i][0]]=j; //点对应的范围 
                tree2[j][++tree2[j][0]]=i;                                                                                                                         
                r[j]++;//范围的入度,内有几个点 
            }
        }
    }





    int num=0;
    while(num<n)
    {
        int t=0,i; 
        for(i=1;i<=n;i++)
        {
            if(r[i]==1)//如果范围对应的点只有一个 
            {
                int x;
                for(int k=1;k<=tree2[i][0];k++)
                  if(!p[tree2[i][k]])
                  {
                    ans[i]=tree2[i][k],p[ans[i]]=true;break;//ans[ ] 内的数不是一个一个挨着放进去的 !而是按照扫到的范围的顺序放进去
                  } 
                t++;num++;
                r[i]=0x7fffffff;                
            }
            for(int j=1;j<=tree[ans[i]][0];j++)
               r[tree[ans[i]][j]]--;
        }
        if(t==0) 
        {
            printf("None");
            return 0;
        }


    }




    for(int i=1;i<=n;i++)
    {
        char c;
        c=i+'A'-1;
        printf("%c %d
",c,ans[i]);
    } 
    return 0;
}
原文地址:https://www.cnblogs.com/dfsac/p/6819768.html