拓补排序之烦人的幻灯片(确实很烦人。。。)
2017-02-09 15:53
337 查看
将入度为一的区间(也就是唯一匹配的点和区间)找出来,把这个点所有出度的入度–,给这个点做标记,输出
继续执行以上操作
继续执行以上操作
#include<cstdio>
#include<cstring>
#include<cmath>
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;
}
相关文章推荐
- PLY格式介绍与读取
- Java中使用Jedis操作Redis
- 你的首个 Progressive Web App
- LeetCode 496. Next Greater Element I
- Swift-字符串
- 计算地球上两个坐标点(经度,纬度)之间距离sql函数
- 85.hdu--1004--Let the Balloon Rise
- sql 小知识
- Parameter Server 详解
- APP实用开发—桌面添加快捷图标
- linux设备驱动归纳总结(五):3.IO静态映射
- sql之left join、right join、inner join的区别
- python爬虫学习——爬取糗百页面段子
- SVN提交(commit)时必须填写备注信息设置
- 【Java并发编程实战】-----“J.U.C”:Condition
- 远程桌面连接凭证不工作
- 数据结构之时间复杂度
- PLSQL连接远程Oracle服务器出现ORA-12638错误
- 多种负载均衡算法及其Java代码实现
- 【连载0】二手电商专题研究前言