[HDOJ5943]Kingdom of Obsession(最大匹配,思路)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5943

题意:n个人编号为[s+1,s+n],有n个座位编号为[1,n],编号为i的人只能坐到编号为它的约数的座位,问每个人是否都有位置坐。

首先,可以肯定的是素数编号的人只能做到自己的编号上或者是1上,那么假如[s+1,s+n]区间内出现了两个以上的素数,那么整个情况是无解的。

其次,假如s<n的话,可以把[s+1,s+n]直接放到[s+1,s+n]上,剩下的将会是s个人和s个座位,人的编号是[n+1,n+s],座位的编号是[s+1,s+n],所以直接给s和n交换一下就行。

我断定1000个数之间一定会出现至少两个素数,因此当n>1000的时候就是无解了。

接下来就是O(n^2),按照能否整除建图了,跑出最大匹配,看看跟n是不是相等就行了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 1010;
 5 int nu, nv;
 6 int G[maxn][maxn];
 7 int linker[maxn];
 8 bool vis[maxn];
 9 int s, n;
10
11 bool dfs(int u) {
12     for(int v = 1; v <= nv; v++) {
13         if(G[u][v] && !vis[v]) {
14             vis[v] = 1;
15             if(linker[v] == -1 || dfs(linker[v])) {
16                 linker[v] = u;
17                 return 1;
18             }
19         }
20     }
21     return 0;
22 }
23
24 int hungary() {
25     int ret = 0;
26     memset(linker, -1, sizeof(linker));
27     for(int u = 1; u <= nu; u++) {
28         memset(vis, 0, sizeof(vis));
29         if(dfs(u)) ret++;
30     }
31     return ret;
32 }
33
34 int main() {
35     // freopen("in", "r", stdin);
36     int T, _ = 1;
37     scanf("%d", &T);
38     while(T--) {
39         scanf("%d %d", &s, &n);
40         memset(G, 0, sizeof(G));
41         printf("Case #%d: ", _++);
42         if(s < n) swap(s, n);
43         if(n > 1000) {
44             puts("No");
45             continue;
46         }
47         nu = 2 * n, nv = n;
48         for(int i = 1; i <= n; i++) {
49             for(int j = 1; j <= n; j++) {
50                 if((s + i) % j == 0) G[i+n][j] = 1;
51             }
52         }
53         if(hungary() == n) puts("Yes");
54         else puts("No");
55     }
56     return 0;
57 }
时间: 2024-10-01 03:31:05

[HDOJ5943]Kingdom of Obsession(最大匹配,思路)的相关文章

HDU5943 Kingdom of Obsession(思路题+二分匹配)

题意: 给你两个数n,s(1e9),问你能否使得s+1--s+n和1--n全部匹配 每个数只能匹配他的因子 思路: 要匹配的这一段数中非重合部分最多有1个素数,也就是说n和s不能同时很大 我打了1e9的素数间隔表,发现最大间距才280多.. 然后索性直接当n和s都大于500的时候就输出no就可以了 符合条件的数非重合部分最多500个,二分匹配一下 /* *********************************************** Author :devil **********

HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 49    Accepted Submission(s): 14 Problem Description There is a kindom of obsession, so people in this kingdom do things very

hdu 5943 Kingdom of Obsession 二分图匹配+素数定理

Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description There is a kindom of obsession, so people in this kingdom do things very strictly. They name themselves in integer, and there

HDU 5943 Kingdom of Obsession 二分图的匹配

题目链接→戳 s,n 1e9的范围直接暴力匹配二分图肯定会T... 对于区间[1,n]和[s+1,s+n],如果存在重叠部分, 比如1,2,3......,n-2,   n-1 ,  n ↓      ↓      ↓ s+1,s+2,s+3......s+n s+1,s+2,s+2直接放在s+1,s+2,s+3的位置,只需要去匹配[1,s]和[n,s+n] 这样,我们需要去匹配的区间内就没有s+i可以放在s+i位置的了,如果区间内存在>=2个素数,这些素数只能放在第一个位置,这种情况肯定是No

HDU 5943 Kingdom of Obsession

题意:n个人编号为[s+1, s+n],有n个座位编号为[1,n],编号为 i 的人只能坐到编号为它的约数的座位,问每个人是否都有位置坐. 题解:由于质数只能坐到1或者它本身的位置上,所以如果[n+1,n+s]区间内如果有多于一个质数时肯定无解, 有解时s 一定很小因为1e9以内,最远的两个素数相差282 (打表得出), 可以证明 [s+1,n]这一段数肯定坐到自己编号的位置上要更好所以剩下的用匈牙利匹配一下即可 简单证明一下" [s+1,n]这一段数肯定坐到自己编号的位置上要更好"

【hiho】hiho第三十一周&#183;二分图最大匹配,一些基础结论也会在此更新

题意: 二分图最大匹配 思路: 二分图最大匹配基础算法就是匈牙利算法,和网络流中的找增广路很类似 个人偏好DFS版本= = 当时也是看kuangbin大大的模板才逐渐摸索的 补充定义和定理: 最大匹配数:最大匹配的匹配边的数目最小点覆盖数:选取最少的点,使任意一条边至少有一个端点被选择最大独立数:选取最多的点,使任意所选两点均不相连最小路径覆盖数:对于一个 DAG(有向无环图),选取最少条路径,使得每个顶点属于且仅属于一条路径.路径长可以为 0(即单个点). 定理1:最大匹配数 = 最小点覆盖数

bzoj 1854: [Scoi2010]游戏 (并查集||二分图最大匹配)

链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1854 写法1: 二分图最大匹配 思路:  将武器的属性对武器编号建边,因为只有10000种属性,我们直接对1-10000跑二分图匹配,同时用时间戳优化匹配. 实现代码: #include<bits/stdc++.h> using namespace std; const int M = 1e6+10; vector<int>g[M]; int vis[M],pre[M],t

hdu 5943(素数间隔+二分图匹配)

Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 200    Accepted Submission(s): 64 Problem Description There is a kindom of obsession, so people in this kingdom do things ver

洛谷 P2071 座位安排 seat.cpp/c/pas

P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最多使多少人坐到自己想坐的位置. 输入输出格式 输入格式: 第一行,一个正整数N. 第二行至第N*2+1行,每行两个正整数Si1,Si2,为每个人想坐的排数. 输出格式: 一个非负整数,为最多使得多少人满意. 输入输出样例 输入样例#1: 复制 4