摘要: 2-sat。不错的一道题,学到了不少。需要注意这么几点:1、题目中描述的是有n对夫妇,其中(n-1)对是来为余下的一对办婚礼的,所以新娘只有一位。2、2-sat问题是根据必然性建边,比如说A与B二选一,那么当不选A时,必然选B。在本题中,我们所能确定的必然性只有一种:当一对通奸者中的一个人出现在新娘的对面时,另一个必须在新娘的同侧。一开始,我每次建的是两条边,即由新娘指向对面的一人,再从这个人,指向与新娘同侧的另一人(语言描述较困难,但我尽量简明的表达出来)。这是一种假设,因为新娘既可能在左边,又可能在右边。但是这不是必然性:“新娘指向对面的一个人”,这条边不存在必然关系。 解决办法:我们假. 阅读全文
posted @ 2013-08-07 19:32 Thousand Sunny 阅读(397) 评论(0) 推荐(0) 编辑
摘要: 题意:在一个无向连通图上,求任意删除一个点,余下连通块的个数。对于一个非割顶的点,删除之后,原图仍连通,即余下连通块个数为1;对于割顶,余下连通块个数>=2。由于是用dfs查找双连通分量,树形结构是向下搜素,所以在dfs过程中不便于统计割顶所分连通分量的个数。换一个角度,通过在vectorbcc中保存各个双连通分量的点,统计各个点出现的次数即可。(除割顶外,每个点只可能出现一次) 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 const int MAXN= 1... 阅读全文
posted @ 2013-08-07 13:12 Thousand Sunny 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 这道题在LA是挂掉了,不过还好,zoj上也有这道题。题意:好大一颗树,询问父子关系。。考虑最坏的情况,30w层,2000w个点,询问100w次,貌似连dfs一遍都会TLE。安心啦,这肯定是一道正常人能做的题目。不过是需要几个小技巧。1、2000w个点不一定都要保存下来,事实上,虽然题目给了256M的空间,只要开了两个这么大的数组,MLE是跑不了的,所以只保存30w个父节点。2、如果这30w个父节点构成一条链,dfs的栈肯定爆。所以需要用栈模拟dfs。这里用的是stack,当然手写栈会更快。注意:1、时间戳的使用。 2、本题中顺序对节点标号,使得所有>=n的节点都是叶子节点,同时能够二分也 阅读全文
posted @ 2013-08-07 10:32 Thousand Sunny 阅读(524) 评论(0) 推荐(0) 编辑