POJ 1486 Sorting Slides

http://poj.org/problem?id=1486

题意:给n个矩形的4个边界的坐标(左上和右下),分别是:xmin、xmax、ymin、ymax。又给出四个数字的坐标。每个数字只能属于一个矩形。求出每个数字的从属关系。

题解:二分图最大匹配问题:数字和矩形的匹配。要求出每一条必须边。先求出最大匹配ans,然后删除每一条边,再进行匹配,看最大匹配是否等于ans:如果相等,则这条边不是必须边;如果
 小于ans,则这条边是必须边。

注意点:删除边之后要恢复这条边;输出格式……


  1 #include <iostream>
2 #include <cstring>
3 #include <cstdio>
4 #include <cstdlib>
5 #include <cmath>
6 #include <string>
7 #include <vector>
8 #include <list>
9 #include <map>
10 #include <queue>
11 #include <stack>
12 #include <bitset>
13 #include <algorithm>
14 #include <numeric>
15 #include <functional>
16 #include <set>
17 #include <fstream>
18
19 using namespace std;
20
21 const int maxn=110;
22 int V;
23 int G[maxn][maxn];
24 int match[maxn];
25 int used[maxn];
26 int n;
27 struct cos{
28 int xmin,xmax,ymin,ymax;
29 }s[maxn];
30 struct numb{
31 int x,y;
32 }num[maxn];
33
34 bool dfs(int v)
35 {
36 for (int i=0; i<n; i++) {
37 if (!used[i]&&G[v][i]) {
38 used[i]=1;
39 if (match[i]==-1||dfs(match[i])) {
40 match[i]=v;
41 return true;
42 }
43 }
44 }
45 return false;
46 }
47
48 int bipartite_matching()
49 {
50 int res=0;
51 memset(match, -1, sizeof(match));
52 for (int v=0; v<V; v++) {
53 // if (match[v]<0) {
54 memset(used, 0, sizeof(used));
55 if (dfs(v)) {
56 res++;
57 }
58 //}
59 }
60 return res;
61 }
62 int main()
63 {
64 //freopen("/Users/apple/Desktop/POJ 1486/POJ 1486/in", "r", stdin);
65 // freopen("/Users/apple/Desktop/POJ 1486/POJ 1486/out", "w", stdout);
66 int mycase=0;
67 while ((scanf("%d",&n))!=EOF&&n!=0) {
68 V=n;
69 mycase++;
70 memset(G, 0, sizeof(G));
71 for (int i=0; i<n; i++) {
72 scanf("%d%d%d%d",&s[i].xmin,&s[i].xmax,&s[i].ymin,&s[i].ymax);
73 }
74 for (int i=0; i<n; i++) {
75 scanf("%d%d",&num[i].x,&num[i].y);
76 }
77 for (int i=0; i<n; i++) {
78 for (int j=0; j<n; j++) {
79 if ((num[j].x>=s[i].xmin)&&(num[j].x<=s[i].xmax)&&(num[j].y>=s[i].ymin)&&(num[j].y<=s[i].ymax)) {
80 G[i][j]=1;
81 }
82 }
83 }
84 printf("Heap %d\n",mycase);
85 int ans=bipartite_matching();
86 bool flag=false;
87 for (int i=0; i<n; i++) {
88 for (int j=0; j<n; j++) {
89 if (G[i][j]==0) {
90 continue;
91 }
92 G[i][j]=0;
93 if (bipartite_matching()<ans) {
94 flag=true;
95 printf("(%c,%d) ",‘A‘+i,j+1);
96 }
97 G[i][j]=1;
98 }
99 }
100 if (flag==0) {
101 printf("none\n\n");
102 }
103 else printf("\n\n");
104 }
105 return 0;
106 }

时间: 2024-10-25 17:00:19

POJ 1486 Sorting Slides的相关文章

poj 1486 Sorting Slides(二分图匹配的查找应用)

Description Professor Clumsey is going to give an important talk this afternoon. Unfortunately, he is not a very tidy person and has put all his transparencies on one big heap. Before giving the talk, he has to sort the slides. Being a kind of minima

POJ - 1486 Sorting Slides 二分图 完美匹配

题目大意:有n张透明的矩形纸张散乱在桌面上,每张纸张上面都有一个数字. 现在给出每个矩形的左下角和右上角坐标和每个数字所在的位置,问能否找出每个矩形唯一的对应数字 解题思路:分析该题可得到,二分图匹配的结果肯定是完美匹配,匹配的结果肯定为n. 接着就要判断每个点是否唯一匹配了 判断能否唯一匹配,就要在完美匹配的情况下,删除该点的那条匹配,如果还能再找出一个完美匹配,那么就表示该点表示不唯一 #include<cstdio> #include<vector> #include<

POJ 1486 Sorting Slides【二分图匹配】

题目大意:有n张幻灯片和n个数字,幻灯片放置有重叠,每个数字隶属于一个幻灯片,现在问你能够确定多少数字一定属于某个幻灯片 思路:上次刷过二分图的必须点后这题思路就显然了 做一次二分匹配后将当前匹配的边删除,再做一次二分匹配,如果能匹配到那么说明这条边不是必须边 顺便说下 删边以后不用从头开始二分匹配,而是在原来二分匹配的基础上对这个点进行增广就行,另外这题格式需要注意,很容易PE #include<cstdio> #include<string.h> #include<ios

拓扑序列变形 之 poj 1094 Sorting It All Out

/* 拓扑序列变形 之 poj 1094 Sorting It All Out 变形: 在每消去唯一一个入度为0的点后,只剩下唯一一个入度为0的点. 这样获得的n个点才是排序好的. */ 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstddef> 5 #include <iterator> 6 #include <algorithm&

拓扑排序 POJ 1049 Sorting It All Out

题目传送门 1 /* 2 拓扑排序裸题:有三种情况: 3 1. 输入时发现与之前的矛盾,Inconsistency 4 2. 拓扑排序后,没有n个点(先判断cnt,即使一些点没有边连通,也应该是n,此时错误是有环): 5 flag = -1 表示不确定:return 2 表示拓扑序唯一 6 3. 其他情况都是 Sorted sequence cannot be determined. 7 8 */ 9 #include <cstdio> 10 #include <algorithm>

poj 1094 Sorting It All Out 解题报告

题目链接:http://poj.org/problem?id=1094 题目意思:给出 n 个待排序的字母 和 m 种关系,问需要读到第 几 行可以确定这些字母的排列顺序或者有矛盾的地方,又或者虽然具体的字母顺序不能确定但至少不矛盾.这些关系均是这样的一种形式: 字母1 < 字母2 这道题目属于图论上的拓扑排序,由于要知道读入第几行可以确定具体的顺序,所以每次读入都需要进行拓扑排序来检验,这时每个点的入度就需要存储起来,所以就有了代码中memcpy 的使用了. 拓扑排序的思路很容易理解,但写起来

[POJ 1674] Sorting by Swapping

Sorting by Swapping Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9514   Accepted: 5094 Description Given a permutation of numbers from 1 to n, we can always get the sequence 1, 2, 3, ..., n by swapping pairs of numbers. For example, i

poj 1094 Sorting It All Out[ topo]

传送门:http://poj.org/problem?id=1094 Sorting It All Out Description An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequen

POJ 1094 Sorting It All Out 拓扑排序

Sorting It All Out Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & %llu Description An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to