热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ZOJ3316Game(带花树算法)

http:acm.zju.edu.cnonlinejudgeshowProblem.do?problemId3726将同在L范围内的棋子建立边,然后做一般图的最大匹配

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3726

将同在L范围内的棋子建立边,然后做一般图的最大匹配(带花树算法),如果是完美匹配则输出YES;否则输出NO。

如果有完美匹配的话,顺着匹配拿掉棋子即可使后手赢。

1 //#pragma comment(linker, "/STACK:102400000,102400000")
2 #include
3 #include
4 #include
5 #include<string>
6 #include
7 #include<set>
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 #include
17 using namespace std;
18 typedef long long LL;
19 #define ROUND(x) round(x)
20 #define FLOOR(x) floor(x)
21 #define CEIL(x) ceil(x)
22 const int maxn&#61;500;
23 const int inf&#61;0x3f3f3f3f;
24 const LL inf64&#61;0x3f3f3f3f3f3f3f3fLL;
25 const double INF&#61;1e30;
26 const double eps&#61;1e-6;
27
28 /**
29 *一般图的最大基数匹配&#xff1a;带花树算法
30 *输入&#xff1a;g[][],n(输入从0到n-1,用addEdge()加边)
31 *输出&#xff1a;gao()(最大匹配数),match[](匹配)
32 */
33 //const int maxn&#61;0;
34 struct Matching
35 {
36 deque<int> Q;
37 int n;
38 //g[i][j]存放关系图&#xff1a;i,j是否有边,match[i]存放i所匹配的点
39 bool g[maxn][maxn],inque[maxn],inblossom[maxn],inpath[maxn];
40 int match[maxn],pre[maxn],base[maxn];
41
42 //找公共祖先
43 int findancestor(int u,int v)
44 {
45 memset(inpath,0,sizeof(inpath));
46 while(1)
47 {
48 u&#61;base[u];
49 inpath[u]&#61;true;
50 if(match[u]&#61;&#61;-1)break;
51 u&#61;pre[match[u]];
52 }
53 while(1)
54 {
55 v&#61;base[v];
56 if(inpath[v])return v;
57 v&#61;pre[match[v]];
58 }
59 }
60
61 //压缩花
62 void reset(int u,int anc)
63 {
64 while(u!&#61;anc)
65 {
66 int v&#61;match[u];
67 inblossom[base[u]]&#61;1;
68 inblossom[base[v]]&#61;1;
69 v&#61;pre[v];
70 if(base[v]!&#61;anc)pre[v]&#61;match[u];
71 u&#61;v;
72 }
73 }
74
75 void contract(int u,int v,int n)
76 {
77 int anc&#61;findancestor(u,v);
78 //SET(inblossom,0);
79 memset(inblossom,0,sizeof(inblossom));
80 reset(u,anc);
81 reset(v,anc);
82 if(base[u]!&#61;anc)pre[u]&#61;v;
83 if(base[v]!&#61;anc)pre[v]&#61;u;
84 for(int i&#61;1; i<&#61;n; i&#43;&#43;)
85 if(inblossom[base[i]])
86 {
87 base[i]&#61;anc;
88 if(!inque[i])
89 {
90 Q.push_back(i);
91 inque[i]&#61;1;
92 }
93 }
94 }
95
96 bool dfs(int S,int n)
97 {
98 for(int i&#61;0; i<&#61;n; i&#43;&#43;)pre[i]&#61;-1,inque[i]&#61;0,base[i]&#61;i;
99 Q.clear();
100 Q.push_back(S);
101 inque[S]&#61;1;
102 while(!Q.empty())
103 {
104 int u&#61;Q.front();
105 Q.pop_front();
106 for(int v&#61;1; v<&#61;n; v&#43;&#43;)
107 {
108 if(g[u][v]&&base[v]!&#61;base[u]&&match[u]!&#61;v)
109 {
110 if(v&#61;&#61;S||(match[v]!&#61;-1&&pre[match[v]]!&#61;-1))contract(u,v,n);
111 else if(pre[v]&#61;&#61;-1)
112 {
113 pre[v]&#61;u;
114 if(match[v]!&#61;-1)Q.push_back(match[v]),inque[match[v]]&#61;1;
115 else
116 {
117 u&#61;v;
118 while(u!&#61;-1)
119 {
120 v&#61;pre[u];
121 int w&#61;match[v];
122 match[u]&#61;v;
123 match[v]&#61;u;
124 u&#61;w;
125 }
126 return true;
127 }
128 }
129 }
130 }
131 }
132 return false;
133 }
134
135 void init(int n)
136 {
137 this->n &#61; n;
138 memset(match,-1,sizeof(match));
139 memset(g,0,sizeof(g));
140 }
141
142 void addEdge(int a, int b)
143 {
144 &#43;&#43;a;
145 &#43;&#43;b;
146 g[a][b] &#61; g[b][a] &#61; 1;
147 }
148
149 int gao()
150 {
151 int ans &#61; 0;
152 for (int i &#61; 1; i <&#61; n; &#43;&#43;i)
153 if (match[i] &#61;&#61; -1 && dfs(i, n))
154 &#43;&#43;ans;
155 return ans;
156 }
157 } match;
158
159 int n,m,L;
160 vectorint,int> > node;
161 int dist(pair<int,int> A,pair<int,int> B)
162 {
163 return abs(A.first-B.first)&#43;abs(A.second-B.second);
164 }
165 void init()
166 {
167 node.clear();
168 match.init(m);
169 }
170 void input()
171 {
172 n&#61;m;
173 int u,v;
174 while(m--)
175 {
176 scanf("%d%d",&u,&v);
177 node.push_back(pair<int,int>(u,v));
178 }
179 scanf("%d",&L);
180 pair<int,int> x,y;
181 for(int i&#61;0;i)
182 {
183 x&#61;node[i];
184 for(int j&#61;0;j)
185 {
186 if(i&#61;&#61;j) continue;
187 y&#61;node[j];
188 if(dist(x,y)<&#61;L) match.addEdge(i,j);
189 }
190 }
191 }
192 void solve()
193 {
194 if(match.gao()*2&#61;&#61;n) puts("YES");
195 else puts("NO");
196 }
197 int main()
198 {
199 // std::ios_base::sync_with_stdio(false);
200 // freopen("in.cpp","r",stdin);
201 while(~scanf("%d",&m))
202 {
203 init();
204 input();
205 solve();
206 }
207 return 0;
208 }

View Code

 

转:https://www.cnblogs.com/xysmlx/p/3273249.html



推荐阅读
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有