博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
拓补排序之烦人的幻灯片(确实很烦人。。。)
阅读量:7198 次
发布时间:2019-06-29

本文共 1383 字,大约阅读时间需要 4 分钟。

将入度为一的区间(也就是唯一匹配的点和区间)找出来,把这个点所有出度的入度–,给这个点做标记,输出

继续执行以上操作

#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;}

转载于:https://www.cnblogs.com/wspl98765/p/6819893.html

你可能感兴趣的文章
我的友情链接
查看>>
小小的起步VMware vSphere之四
查看>>
微软S2D2016滚动升级2019
查看>>
数组中第一个只出现一次的字符
查看>>
Linux虚拟机下lvm扩大根目录磁盘空间
查看>>
tomcat应用实践(虚拟主机以及站点优化)
查看>>
使用VB.NET重构简单知识简述
查看>>
访问网络共享
查看>>
xfreerdp的用法
查看>>
Redis有序集合数据类型操作命令
查看>>
iOS项目分层
查看>>
Apache+PHP+MySQL搭建步骤
查看>>
vue常用命令v-model
查看>>
进制间的相互转换
查看>>
CyanogenMod 编译 Google Galaxy Nexus (GSM) 全过程
查看>>
oracle case when的用法
查看>>
2.2 使用 JAXP 对XML文档进行SAX解析
查看>>
W-2 Grub4dos硬盘安装BackTrack
查看>>
python文件操作一
查看>>
萌新的Linux学习之路(十三)--Linux中设备的访问
查看>>