UVa 11294 Wedding (TwoSat)】的更多相关文章

题意:有 n-1 对夫妻参加一个婚宴,所有人都坐在一个长长的餐桌左侧或者右侧,新郎和新娘面做面坐在桌子的两侧.由于新娘的头饰很复杂,她无法看到和她坐在同一侧餐桌的人,只能看到对面餐桌的人.任意一对夫妻不能坐在桌子的同侧,另外有m对人吵过架,而新娘不希望看到两个吵过架的人坐在他的对面,问如何安排这些座位. 析:很明显的TwoSat问题,假设mark[i<<1]标记了,就是和新娘同侧,否则就是和新娘对侧,这样的话,对于每对吵架的人,他们要么在不同的侧,要么在新娘同侧,注意一定要注意要提前把新娘标记…
UVA 11294 - Wedding 题目链接 题意:有n对夫妻,0号是公主.如今有一些通奸关系(男男,女女也是可能的)然后要求人分配在两側.夫妻不能坐同一側.而且公主对面一側不能有两个同奸的人,问方案 思路:2-set,建图.一共2n个人,设偶数是丈夫,奇数是妻子.左側为false,右側为true,然后丈夫妻子建一条true false 或 false true的边,然后然公主在左側.那么同奸的一对至少一个为false,建一条边,然后2-set判定就可以 代码: #include <cstd…
给n对夫妇安排座位,其中0h,0w分别表示新郎,新娘.同一对新郎,新娘不能坐在同一侧,而且互为通奸关系的人不能同时坐在新娘对面. 这道题目真是掉尽节操啊,,,欧美的氛围还是比较开放的. 分析: 首先说一下应该注意的是新郎新娘也可能是会有通奸关系出现的,所以一开始必须将他们考虑进去. 为每对夫妇设立一个变量,xi,1表示妻子和新娘坐在同侧,否则表示丈夫和新郎坐在同侧.然后用mark[2*i], mark[2*i^1]被标记时表示假,真,一开始应该将mark[1]标记. 然后考虑通奸关系: i和j同…
2-sat.不错的一道题,学到了不少. 需要注意这么几点: 1.题目中描述的是有n对夫妇,其中(n-1)对是来为余下的一对办婚礼的,所以新娘只有一位. 2.2-sat问题是根据必然性建边,比如说A与B二选一,那么当不选A时,必然选B.在本题中,我们所能确定的必然性只有一种:当一对通奸者中的一个人出现在新娘的对面时,另一个必须在新娘的同侧.一开始,我每次建的是两条边,即由新娘指向对面的一人,再从这个人,指向与新娘同侧的另一人(语言描述较困难,但我尽量简明的表达出来).这是一种假设,因为新娘既可能在…
可以把一对夫妇当成一个节点,然后拆点的话,h和w分别为真和假,然后直接按照题目中说的建图染色即可 #include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <queue> #include <algorithm> using namespace std; const int maxn = 100; const int maxm…
题意: 有N-1对夫妻参加一个婚宴,所有人都坐在一个长长的餐桌左侧或者右侧,新郎和新娘面做面坐在桌子的两侧.由于新娘的头饰很复杂,她无法看到和她坐在同一侧餐桌的人,只能看到对面餐桌的人.任意一对夫妻不能坐在桌子的同侧,另外有m对人吵过架,而新娘不希望看到两个吵过架的人同时坐在他的对面,问如何安排这些座位 解析: 原本我想的是 把每个人分别拆点  左右分别是 2*i  和 2*i+1  但..仔细想一下 妻子和丈夫不能坐在同一边  而且一对夫妻的编号也是一样的  不如就把夫妻两人分别作为 2*i…
Problem E: Wedding Up to thirty couples will attend a wedding feast, at which they will be seated on either side of a long table. The bride and groom sit at one end, opposite each other, and the bride wears an elaborate headdress that keeps her from…
题目链接:https://vjudge.net/contest/166461#problem/C 题意: n对夫妻,有m对人吵过架,不能排在同一边,求新娘的一边的人: 分析: 每对夫妻,看成两个点,女的 2i,男的2i+1,吵架了的关系,就是必然关系,必须满足,不能在同一边:再用2-SAT #include <bits/stdc++.h> using namespace std; +; struct TwoSAT { int n; vector<]; ]; ],cnt; bool dfs…
题目大意:我们的朋友Bob要结婚了,所以要为他买一些衣服.有m的资金预算,要买c种类型的衣服(衬衫.裤子等),而每种类型的衣服有k个选择(只能做出一个选择),每个选择的衣服都有一个价格,问如何选择才能使花费控制在预算范围内并使得花费尽量大?输出最大花费. 用dp进行解决,bool dp[i][j]用以表明在买完第i种类型的衣服后是否可能有j的资金剩余.递推至dp[c][],找出dp[c][]中最小的资金剩余. #include <cstdio> #include <cstring>…
B: Uva: 12582 - Wedding of Sultan 给定一个字符串(仅由大写字母构成)一个字母表示一个地点,经过这个点或离开这个点都输出这个地点的字母) 问: 每一个地点经过的次数(维护一个栈就能够了,注意进入起点和离开起点都不算入起点的次数) #include<cstdio> #include<cstring> #include<stack> #include<iostream> #include<algorithm> usin…