POJ1486模拟或者匈牙利变种
题意:
有n个矩形,每个矩形上的某个位置上都有一个点,但是由于矩形是透明的,当一些矩形重叠在一起的时候就很可能分不清哪个点是那个矩形的,给你n个矩形的坐标,还有n个点的坐标,然后让你找出所有能确定的点。
思路:
两种方法做的,第一种是用的模拟的方法,我是这么想的,如果把一个状态给我们自己我们会怎么判断?我肯定是先找到我一眼就能看出来的删除,什么样的算是可以删除的?如果一个框上只有一个点,或者一个点只在一个框上,那么就可以肯定找到了一对,这样做的话要考虑到一个问题,那么就是有对是一看看不出来的,也就是说一开始断定不了,随着一些可以断定的删除之后就可以断定了,所以要while(1)循环的去找,这样显然是能搞定的,写的时候可以存两个方向的图,还有度数...模拟细节不啰嗦,然后就是第二种方法,这个方法比较容易写,也是大多数人认可的方法,但是一开始我并没有写,原因是我很难说服我自己这种方法是对的,因为我总担心,如果当前这条边不是匹配的关键边,但是随着别的边的删除,后来不是匹配的有成了匹配的怎么办?这么想可能是因为我写的第一种方法while(1)的原因,后来就是不停的自己画画画,终于明白了,哎!其实是我自己想多了,首先用匹配去做与我的第一种方法根本没有任何关联,也就是思路完全不同,匹配的思路就是只要是关键边,那么删除之后肯定是对匹配数有影响,如果没有影响的边,无论怎么while(1)最后还是没有影响,因为至少出现一组可以和他替换的边,这么这两组(或多组)可以互相替换的边彼此束缚着对方,就像是死锁一样,已经死锁的关联进程中,无论你以什么样的顺序去尝试执行都没意义,因为你“在环里了”,匹配的实现起来比较简单,直接匹配一遍,然后尝试删除匹配好的边就行了。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N_node 26 + 5
#define N_edge 26 * 26 + 10
using namespace std;
typedef struct
{
int to ,next;
}STAR;
typedef struct
{
int x1 ,x2 ,y1 ,y2;
}EDGE;
typedef struct
{
int x ,y;
}NODE;
typedef struct
{
int id;
char c;
}ANS;
ANS ans[N_node];
STAR E[N_edge];
EDGE edge[N_node];
NODE node[N_node];
int list[N_node] ,tot;
int mkdfs[N_node] ,mkgx[N_node];
int p1[N_node] ,p2[N_node];
void add(int a ,int b)
{
E[++tot].to = b;
E[tot].next = list[a];
list[a] = tot;
}
int DFS_XYL(int x ,int a ,int b)
{
for(int k = list[x] ;k ;k = E[k].next)
{
int to = E[k].to;
if(x == a && b == to)
continue;
if(mkdfs[to]) continue;
mkdfs[to] = 1;
if(mkgx[to] == -1 || DFS_XYL(mkgx[to] ,a ,b))
{
mkgx[to] = x;
return 1;
}
}
return 0;
}
int XYL(int n ,int a ,int b)
{
memset(mkgx ,255 ,sizeof(mkgx));
int ans = 0;
for(int i = 1 ;i <= n ;i ++)
{
memset(mkdfs ,0 ,sizeof(mkdfs));
ans += DFS_XYL(i ,a ,b);
}
return ans;
}
bool jude(EDGE a ,NODE b)
{
return a.x1 <= b.x && a.x2 >= b.x && a.y1 <= b.y && a.y2 >= b.y;
}
bool camp(ANS a ,ANS b)
{
return a.c < b.c;
}
int main ()
{
int n ,i ,j ,cas = 1;
while(~scanf("%d" ,&n) && n)
{
for(i = 1 ;i <= n ;i ++)
scanf("%d %d %d %d" ,&edge[i].x1 ,&edge[i].x2 ,&edge[i].y1 ,&edge[i].y2);
for(i = 1 ;i <= n ;i ++)
scanf("%d %d" ,&node[i].x ,&node[i].y);
memset(list ,0 ,sizeof(list));
tot = 1;
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= n ;j ++)
if(jude(edge[i] ,node[j]))
add(i ,j);
XYL(n ,0 ,0);
for(i = 1 ;i <= n ;i ++)
p1[i] = mkgx[i] ,p2[i] = i;
int ansid = 0;
for(i = 1 ;i <= n ;i ++)
{
if(XYL(n ,p1[i] ,p2[i]) != n)
{
ans[++ansid].c = p1[i] + 'A' - 1;
ans[ansid].id = p2[i];
}
}
printf("Heap %d\n" ,cas ++);
if(!ansid) printf("none\n");
else
{
sort(ans + 1 ,ans + ansid + 1 ,camp);
for(i = 1 ;i <= ansid ;i ++)
{
if(i == 1) printf("(%c,%d)" ,ans[i].c ,ans[i].id);
else printf(" (%c,%d)" ,ans[i].c ,ans[i].id);
}
printf("\n");
}
printf("\n");
}
}
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N_node 26 + 5
#define N_edge 26 * 26 + 10
using namespace std;
typedef struct
{
int to ,next;
}STAR;
typedef struct
{
int x1 ,y1 ,x2 ,y2;
}HDP;
typedef struct
{
int x ,y;
}NODE;
typedef struct
{
char c;
int id;
}ANS;
STAR E1[N_edge] ,E2[N_edge];
HDP hdp[N_node];
NODE node[N_node];
ANS ans[N_node];
int list1[N_node] ,list2[N_node] ,tot;
int dep1[N_node] ,mkuse1[N_node];
int dep2[N_node] ,mkuse2[N_node];
bool camp(ANS a ,ANS b)
{
return a.c < b.c;
}
void add(int a ,int b)
{
E1[++tot].to = b;
E1[tot].next = list1[a];
list1[a] = tot;
E2[tot].to = a;
E2[tot].next = list2[b];
list2[b] = tot;
}
bool jude(HDP a ,NODE b)
{
return a.x1 <= b.x && a.x2 >= b.x && a.y1 <= b.y && a.y2 >= b.y;
}
int main ()
{
int n ,i ,j ,cas = 1;
while(~scanf("%d" ,&n) && n)
{
for(i = 1 ;i <= n ;i ++)
scanf("%d %d %d %d" ,&hdp[i].x1 ,&hdp[i].x2 ,&hdp[i].y1 ,&hdp[i].y2);
for(i = 1 ;i <= n ;i ++)
scanf("%d %d" ,&node[i].x ,&node[i].y);
memset(list1 ,0 ,sizeof(list1));
memset(list2 ,0 ,sizeof(list2));
tot = 1;
memset(dep1 ,0 ,sizeof(dep1));
memset(dep2 ,0 ,sizeof(dep2));
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= n ;j ++)
if(jude(hdp[i] ,node[j]))
{
add(i ,j);
dep1[i] ++;
dep2[j] ++;
}
int ansid = 0;
memset(mkuse1 ,0 ,sizeof(mkuse1));
memset(mkuse2 ,0 ,sizeof(mkuse2));
while(1)
{
int mk = 0;
for(i = 1 ;i <= n ;i ++)
{
if(dep1[i] == 1 && !mkuse1[i])
{
mkuse1[i] = 1;
mk = 1;
int to;
for(int k = list1[i] ;k ;k = E1[k].next)
{
if(!mkuse2[E1[k].to])
{
mkuse2[E1[k].to] = 1;
to = E1[k].to;
break;
}
}
dep2[to] --;
for(int k = list2[to] ;k ;k = E2[k].next)
dep1[E2[k].to] --;
ans[++ansid].c = i + 'A' - 1;
ans[ansid].id = to;
}
}
for(i = 1 ;i <= n ;i ++)
{
if(dep2[i] == 1 && !mkuse2[i])
{
mkuse2[i] = 1;
mk = 1;
int to;
for(int k = list2[i] ;k ;k = E2[k].next)
{
if(!mkuse1[E2[k].to])
{
mkuse1[E2[k].to] = 1;
to = E2[k].to;
break;
}
}
dep1[to] --;
for(int k = list1[to] ;k ;k = E1[k].next)
dep2[E1[k].to] --;
ans[++ansid].c = to + 'A' - 1;
ans[ansid].id = i;
}
}
if(!mk) break;
}
printf("Heap %d\n" ,cas ++);
if(!ansid) printf("none\n");
else
{
sort(ans + 1 ,ans + ansid + 1 ,camp);
for(i = 1 ;i <= ansid ;i ++)
{
if(i == 1) printf("(%c,%d)" ,ans[i].c ,ans[i].id);
else printf(" (%c,%d)" ,ans[i].c ,ans[i].id);
}
printf("\n");
}
printf("\n");
}
return 0;
}
POJ1486模拟或者匈牙利变种的更多相关文章
- RNN(2) ------ “《A Critical Review of Recurrent Neural Networks for Sequence Learning》RNN综述性论文讲解”(转载)
原文链接:http://blog.csdn.net/xizero00/article/details/51225065 一.论文所解决的问题 现有的关于RNN这一类网络的综述太少了,并且论文之间的符号 ...
- [Lydsy1805月赛]quailty 算法 BZOJ5362
分析: 题目中描述了一个二分图,让我们求最小权最大匹配,实际上其实是求n个点,在n*(n-1)/2中选n条边的权值和最小,形成一个每个点都有出边的体系,也就是基环树,(证明:因为我们需要二分图最大匹配 ...
- NOIP 模拟 box - 费用流 / 匈牙利
题目大意: 给出n(\(\le 200\))个盒子,第i个盒子长\(x_i\),宽\(y_i\),一个盒子可以放入长宽都大于等于它的盒子里,并且每个盒子里只能放入一个盒子(可以嵌套),嵌套的盒子的占地 ...
- BZOJ3291Alice与能源计划——匈牙利算法+模拟费用流
题目描述 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验.为 了方便,我们可以将火星抽象成平面,并建立平面直角坐标系.火星上一共有N个居民点 ...
- BZOJ2557[Poi2011]Programming Contest——匈牙利算法+模拟费用流
题目描述 Bartie and his friends compete in the Team Programming Contest. There are n contestants on each ...
- App开发:模拟服务器数据接口 - MockApi
为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...
- HDU5090--Game with Pearls 二分图匹配 (匈牙利算法)
题意:给N个容器,每个容器里有一定数目的珍珠,现在Jerry开始在管子上面再放一些珍珠,放上的珍珠数必须是K的倍数,可以不放.最后将容器排序,如果可以做到第i个容器上面有i个珍珠,则Jerry胜出,反 ...
- java 工厂的变形模拟的各种应用
工厂模式是在项目开发中使用效率高,意一个接口,该定义用于创建对象.让子类来决定哪一个类实例. 这就是一个工厂类的示意图 接着来一个简单的样例: 如上图所看到的,我们首先定义我们的产品抽象类接口,也能够 ...
- 模拟Paxos算法及其简单学习总结
一.导读 Paxos算法的流程本身不算很难,但是其推导过程和证明比较难懂.在Paxos Made Simple[1]中虽然也用了尽量简化的流程来解释该算法,但其实还是比较抽象,而且有一些细节问题没有交 ...
随机推荐
- PBR:基于物理的渲染(Physically Based Rendering)+理论相关
一: 关于能量守恒 出射光线的能量永远不能超过入射光线的能量(发光面除外).如图示我们可以看到,随着粗糙度的上升镜面反射区域的会增加,但是镜面反射的亮度却会下降.如果不管反射轮廓的大小而让每个像素的镜 ...
- python3 中post处理json 数据
使用详情如下 import json import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT ...
- JPress企业站主题-zbout
JPress企业站主题-zbout 经典的黑白灰颜色搭配风格,首页配置有轮播图.案例展示.公司简介.新闻中心.联系方式以及合作伙伴模块,全站使用了响应式结构,可以自适应电脑端和手机端浏览器访问.主题整 ...
- P3388 【模板】割点(割顶) 题解 (Tarjan)
题目链接 P3388 [模板]割点(割顶) 解题思路 最近学的东西太杂了,多写点博客免得自己糊里糊涂的过去了. 这个题求割点,感觉这篇文章写得挺好. 割点是啥?如果去掉这个点之后连通图变成多个不连通图 ...
- springcloud知识点总结
一.SpringCloud面试题口述1.SpringCloud和DubboSpringCloud和Dubbo都是现在主流的微服务架构SpringCloud是Apache旗下的Spring体系下的微服务 ...
- 一键获取linux内存、cpu、磁盘IO等信息脚本编写,及其原理详解
更多linux知识,请关注公众号:一口Linux 一.脚本 今天主要分享一个shell脚本,用来获取linux系统CPU.内存.磁盘IO等信息. #!/bin/bash # 获取要监控的本地服务器IP ...
- clickhouse 亿级数据性能测试
clickhouse 在数据分析技术领域早已声名远扬,如果还不知道可以 点这里 了解下. 最近由于项目需求使用到了 clickhouse 做分析数据库,于是用测试环境做了一个单表 6 亿数据量的性能测 ...
- Windows下解析命令行参数
linux通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析命令行参数. 移植到Windows下 getopt.h #ifndef _GETO ...
- 4、MyBatis教程之配置解析
5.配置解析 核心配置文件 mybatis-config.xml 系统核心配置文件 MyBatis 的配置文件会深深影响 MyBatis 行为的设置和属性信息. 能配置的内容如下: configura ...
- irace package -- 参数调优神器
目录 1. irace 是什么 2. 安装 irace 3. irace 的运行机制 4. irace 的配置环境 4.1. parameters 4.2. target algorithm runn ...