将入度为一的区间(也就是唯一匹配的点和区间)找出来,把这个点所有出度的入度–,给这个点做标记,输出
继续执行以上操作#include#include #include using namespace std;struct hu{ int x,y; int z,w;}a[99999];char c[999];int n;int d[1999][1999]; int r[9999];int f[99][99];int s[99999];int flag[999];int main(){ scanf("%d",&n); for(int i=n+1;i<=2*n;i++) { scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].z,&a[i].w); c[i]='A'+i-n-1; } for(int i=1;i<=n;i++) { int x, y; scanf("%d%d",&x,&y); for(int j=n+1;j<=2*n;j++) { if(x>=a[j].x&&x<=a[j].y&&y>=a[j].z&&y<=a[j].w) { f[i][++f[i][0]]=j;//点的出度及对应的区间 d[j][++d[j][0]]=i;//区间入度及对应的点 r[j]++; //入度 } } } for(int i=1;i<=n;i++) { int x=n+1;int j; while(r[x]!=1&&x<=2*n)x++;//找入度唯一的点 r[x]=99999999; for(j=1;j<=d[x][0];j++) if(flag[d[x][j]]==0) { flag[d[x][j]]=1; break; } if(x>2*n) { printf("None"); return 0; } else s[x]=d[x][j];//记录 for(j=1;j<=f[s[x]][0];j++) { r[f[s[x]][j]]--; } }//与拓补排序相似的东西,不过是找入度唯一的。 for(int i=1+n;i<=n*2;i++) printf("%c %d\n",c[i],s[i]);//按abcd顺序输出 return 0;}