摘要: 这题是二分+2SAT.总结一下SAT题的特征。首先,可能会存在二选一的情况,然后会给出一些矛盾。据这些矛盾加边,再用SAT判定。这一道题好像不能直接用printf("%0.3lf"),因为这个是四舍五入的,这道题好像不能四舍五入,只好选减去0.0005再按这个格式输出了。 1 #include ... 阅读全文
posted @ 2014-07-20 10:29 chenjunjie1994 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 逻辑错误的代码 1 //想了很久,发现自己做这道题时犯了一个大BUG。我的思路是,把一组钥匙看成一对X,-X。把 2 //门确定的关系连边。其实这样是有错的,因为边的意义是“必须”,而实际上,门确定的只是矛盾 3 //关系。不是必须是,不是门上锁其中一个选或不选就能影响到另一个。 4 ... 阅读全文
posted @ 2014-07-19 20:50 chenjunjie1994 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 好吧,这次估计是明白边的含义了。X\/Y= -X->Y = -Y->X 这就达成了选了-X必须选Y的目的了。对于这道题,必须要明白题目了。每一个队(三人一队)或者队长留下或者其余两名队员同时留下 : 就可以得到 X\/(Y^Z)=1 而不是互斥的。以及 X->-Y -X->Y 1 #includ... 阅读全文
posted @ 2014-07-19 14:11 chenjunjie1994 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 加深了对有向边意义的理解了。2-SAT 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 const int MAXN=2010; 9 const int ... 阅读全文
posted @ 2014-07-19 10:48 chenjunjie1994 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 2-SAT问题有必要写一下边的含义。所谓,选i必选j的意思是,因为每一对中只能有一个被选,则矛盾的对中若其中一被选i,另一个不可能是j',因为存在矛盾,所以必选 j. 1 #include 2 #include 3 #include 4 #include 5 6 using namespa... 阅读全文
posted @ 2014-07-19 09:24 chenjunjie1994 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 裸的FLOYD 求最小环。 1 #include 2 #include 3 using namespace std; 4 const int inf=100000000; 5 const int MAXN=105; 6 int n,m,minc; 7 int map[MAXN][MAXN],di... 阅读全文
posted @ 2014-07-18 16:51 chenjunjie1994 阅读(145) 评论(0) 推荐(0) 编辑
摘要: floyd求最小环。注意,该算法是用于无向图的。若为有向图,直接用原始的floyd求得点对间的距离,再枚举点对即可。(个人直觉是这样,没试过)改进的floyd求无向图最小环:可以用以下代码:POJ 1734 1 #include 2 #include 3 #include 4 #include... 阅读全文
posted @ 2014-07-18 16:33 chenjunjie1994 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 次小生成树。求出两点间最短路径的最大权值,再把要加入的边与之比较即可。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int MAXN=1010; 8 const int MAXM=... 阅读全文
posted @ 2014-07-18 10:16 chenjunjie1994 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 求一次最小成树,求一次小生成树,若相等,则不唯一。否则,唯一。 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 const int MAXN=105; 8 const int inf=100000... 阅读全文
posted @ 2014-07-18 08:43 chenjunjie1994 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 这道题涉及次小生成树,有必要先弄明白次小生成树是怎么一回事。次小生成树,顾名知义。一个定理是,次小生成树可以由最小生成树交换一条边得到。这怎么证明,可以上网搜一下。但有必要提醒的是,交换过来的这样一条边,必须是未成使用过的(即不是最小生成树的边)。而且,交换走的边,必须是已存在的,而且是两点间最短路... 阅读全文
posted @ 2014-07-18 08:42 chenjunjie1994 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 这题难在破环。对于不是环的情况,只需按照一般的树形DP来做,一步一步往根递推就可以了。对于环,则枚举其中一点的两种情况,取或不取,然后再递推,就可以了。当到达某结点的下一结点为环开始的点时,退出即可。 1 #include 2 #include 3 #include 4 #include 5... 阅读全文
posted @ 2014-07-17 14:02 chenjunjie1994 阅读(274) 评论(0) 推荐(0) 编辑
摘要: 增加一个判素数的步骤就过了。太囧了。。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 int k; 7 8 int main(){ 9 while(scanf("%d",&k)!=EOF){10 ... 阅读全文
posted @ 2014-06-24 17:04 chenjunjie1994 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 简单题,直接用STACK模拟整个过程。模拟出栈时,应注意保护现场,等到递归完成后返回。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 const int MAX=105; 7 8 char ans[MAX*2]; 9... 阅读全文
posted @ 2014-06-23 09:23 chenjunjie1994 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 双向广搜。。。呃,双向广搜一般都都用了HASH判重,这样可以更快判断两个方向是否重叠了。这道题用了双向的BFS,有效地减少了状态。但代码太长了,不写,贴一个别人的代码。。 1 #include 2 #include 3 #include 4 #include 5 using namespa... 阅读全文
posted @ 2014-06-22 22:21 chenjunjie1994 阅读(153) 评论(0) 推荐(0) 编辑
摘要: EASY 1 #include 2 #include 3 using namespace std; 4 5 bool prim[45]; 6 int n; 7 bool vis[45]; 8 int ans[25]; 9 10 void dfs(int top){11 if(top>n... 阅读全文
posted @ 2014-06-22 21:55 chenjunjie1994 阅读(126) 评论(0) 推荐(0) 编辑