纠结死人的2-sat

hdu 1814:

这道题是2-sat的模板题,比较基础…这题的输出方案比较棘手,说是拓扑排序用不了。

比较无语的是:这题用论文上的算法1是可以过的...

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <stack>
 4 #include <iostream>
 5 #include <queue>
 6 #define mp make_pair
 7 #define opp(v) ((v+1^1)-1)
 8 using namespace std;
 9 const int maxn=16001,maxm=40001;
10
11 int ta[maxn],lin[maxm],sd[maxm],pos;
12 void biu(int s,int t) { ++pos; lin[pos]=ta[s]; ta[s]=pos; sd[pos]=t; }
13
14 int n,nn;
15 int color[maxn];
16 void init()//--
17 {
18     pos=0;
19     nn=n<<1;
20     for (int i=1;i<=nn;i++)
21     {
22         ta[i]=0;
23         color[i]=0;
24     }
25 }
26 int jl[maxn],po;
27 bool dfs(int v)
28 {
29     if (color[v]==1) return 1;
30     if (color[v]==2) return 0;
31     color[v]=1; color[opp(v)]=2;
32     jl[++po]=v;
33     bool flag=1;
34     for (int i=ta[v];i;i=lin[i])
35         if (!dfs(sd[i])) { flag=0; break; }
36     return flag;
37 }
38 int main()
39 {
40     for (int m;scanf("%d%d",&n,&m)!=EOF;)
41     {
42         init();
43
44         for (int a,b;m--;)
45         {
46             scanf("%d%d",&a,&b);
47             if (a>b) swap(a,b);
48             biu(a,(b+1^1)-1);
49             biu(b,(a+1^1)-1);
50         }
51         bool flag=1;
52         for (int v=1;v<=nn;v++)
53         {
54             if (color[v]) continue;
55             po=0;
56             if (!dfs(v))
57             {
58                 do color[jl[po]]=color[opp(jl[po])]=0; while (--po);
59                 if (!dfs(opp(v))) { flag=0; break; }
60             }
61         }
62         if (!flag) puts("NIE");
63         else
64             for (int i=1;i<=nn;i++)
65                 if (color[i]==1) printf("%d\n",i);
66     }
67     return 0;
68 }

算法1

做了一道题之后,说说我对2-sat的理解吧。

对于2-sat,一般而言有两种做法。

做法一:直接for一遍未被选过的节点。假定当前节点为Ai,dfs判定及选定它的后代节点。若不满足,则再对Ai‘进行此操作。

做法二:先tarjan缩点判是否矛盾。然后拓扑排序自底向上输出答案。

关于自底向上算法的证明我觉得论文说得不是很清楚,在这里提一下。

自底向上操作时,因为是拓扑排序后的序列,所以当选到某个点时,它的出度必然为零。既然出度为零,那么只有两种可能:一是它没有后代节点,可以选;二是它的后代节点都被选完了,它可以选。两种情况它都可以选...证毕。(感觉这种做法好巧妙...我怎么就想不出这种算法...)

至此,2-sat的研究可以说是告一段落了。

(待续...)

时间: 2024-11-05 19:03:45

纠结死人的2-sat的相关文章

TextMate中zen coding(emmet)的安装

很郁闷的是最近几年没怎么写过前端啊!公司给配置了iMAC 用不了我最爱的notepad++ 于是找到传说中的神器TM下载下来.纠结死人的zen coding却装不好.我这个愚蠢的人类 仍旧通过不懈的反复重试 多方查看,找到了正确安装方法. 我下载的是TM官网展示的最新版.默认的 包的 内容就这些玩意儿  ?? 下载好的emmet文件需要正确的放到如下目录里: 没有的文件夹都自己建立. ??  终于完成了. 自打潜心研究UI与插画后,前端东东都丢的不行不行了. 第一回用TM,还没汉语版本,捉急呀.

新写了一个控制器,结果粗心导致出现了一个问题纠结了半天

新写了一个控制器,结果粗心导致出现了一个问题纠结了半天     误信息如下: 经过逐步排查发现时因为我的方法中用了一个Model ,却把Model的包引入错误所以造成上面的问题: 错误引入的包为:import com.sun.tools.xjc.model.Model; 正确的包为: import org.springframework.ui.Model;

shell if判断(曾经被一个字符串相等的判断纠结半小时,最后只是if后少了个空格!) 和 awk引用外部变量判断

一.if判断 数字: $A=12 $B=15 if(("$A"<"$B")) if(("$A"=="$B")) 字符串: $A="HELLO" $B="WORLD" if [ "$A" = "FACT_LOGIN_USER" ] if [ "$A" = "$B" ] PS:字符串比较的时候注意 'if'

LA 3211 飞机调度(2—SAT)

https://vjudge.net/problem/UVALive-3211 题意: 有n架飞机需要着陆,每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种,第i架飞机的早着陆时间为E,晚着陆时间为L,不得在其他时间着陆.你的任务是为这些飞机安排着陆方式,使得整个着陆计划尽量安全.换句话说,如果把所有飞机的实际着陆时间按照从早到晚的顺序排列,相邻两个着陆时间间隔的最小值. 思路: 二分查找最大值P,每次都用2—SAT判断是否可行. 1 #include<iostream>

选课不再纠结!10个课程搞定Java!

身在茫茫的课程海洋的童鞋们,是不是很迷茫?数百个课程我该学哪个?这个课程质量怎样啊?学院课程小管家整理出了最受欢迎的10个Java类视频课程~迷途中的童鞋们终于不再纠结了!!!10各课程包含了初中高3各阶段,小管家是不是很贴心^_^ 大家有想要的专题欢迎在评论中说明哟,管家会根据需求的情况,进行下一个专题的选择~~~~ (一)  小白进阶必学~ 1.http://edu.51cto.com/course/course_id-4191.html 刘英杰 课程名称:JavaWeb(JSP+servl

PAT (Basic Level) Practise 1001. 害死人不偿命的(3n+1)猜想

1001. 害死人不偿命的(3n+1)猜想 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证

买显示器的各种纠结

第一个纠结:买TN屏还是IPS屏? 就我个人来说,对TN屏情有独钟,但看看评论曰IPS对TN各种吊打...搞的我下了技嘉GTX970Gaming1和山业DP线的订单,把三星4k TN屏的订单撤销了.事儿还没完,准备下Dell U2515H或P2415Q的订单的时候,又听说这块面板是6bit抖成8bit的,还有无漏光不戴尔的雅号.明天显卡和DP线就要来了,主角丢了. 资料显示,TN屏都是6位的,但现在也没有8位面板的消息,倒是说京东方的10.5代生产线上的是8k面板,所以像我这样的普通用户--既非

万恶的KPI、新兴的OKR及让人纠结的程序员考核

最近两天在研究研发部门如何进行绩效管理(其实一直都在思考,关注,实践,总感觉无从下手,也想求助咨询公司,无奈囊中羞涩).查了两天的资料,主要的方向是KPI,OKR,谷歌等互联网公司的考核方法.这里做个简单的整理与总结,记录一些自己思考的结论. 1.KPI万恶论 说KPI毁了索尼都是扯淡,很多大公司如BAT都在用KPI,发展有目共睹,虽然网上曝出各种弊端,但是没有KPI可能更差.企业的生老病死也是自然规律,更多是由外部的大趋势决定的,每次企业大规模的死亡与淘汰都是整个时代在飞速发展而进行正常的新陈

SVN在使用过程中比较纠结的问题记录

对于代码版本管理工具,作为程序员,或多或少,都遇到一些奇葩的问题,我把自己曾经对于SVN遇到的问题做一个记录,废话不多说,直接上正文. 1.在Eclipse中使用远程导入工程时,提示:文件夹””已不存在. 特别说明下,这种错误在连接本地的svn情况可能不会出现,但是如果当你连接到远程服务器的svn这种情况可能就会出现,当初的时候我也是在代码提交本地SVN未出现报错,但是一提交服务器的SVN就会报错,搞得我纠结了好久. 2.Eclipse中添加新的资源位置报错,svn: Number is lar