题目大意:有n个问题,m个人来投票,没人最多投4票,问该怎样决定才能使每个人都有超过一半的票数被认可?

题目分析:2-SAT问题。如果某个人投的票数少于2,则这两票军被采纳,如果票数至少三票,则最多有一票可以不被采纳,这意味着这个人的投的任意两票之间有矛盾,是“二者取一”的关系。

代码如下:

# include<iostream>
# include<cstdio>
# include<vector>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std;
# define LL long long
# define REP(i,s,n) for(int i=s;i<n;++i)
# define CLS(a,b) memset(a,b,sizeof(a))
# define CLL(a,b,n) fill(a,a+n,b) const int N=105;
vector<int>G[N<<1];
int n,m,a[5],b[5],must[N+N],mark[N+N],flag[N],s[N+N],cnt; void add(int x,int u,int y,int v)
{
x=x*2+u;
y=y*2+v;
G[x^1].push_back(y);
G[y^1].push_back(x);
} void dfs1(int u)
{
must[u]=1;
REP(i,0,G[u].size()) if(!must[G[u][i]]) dfs1(G[u][i]);
} void clear()
{
CLS(mark,0);
REP(i,0,n+n) mark[i]=must[i];
} bool dfs(int x)
{
if(mark[x^1]) return false;
if(mark[x]) return true;
mark[x]=1;
s[cnt++]=x;
REP(i,0,G[x].size()) if(!dfs(G[x][i])) return false;
return true;
} bool solve()
{
for(int i=0;i<n+n;i+=2){
if(mark[i]&&mark[i+1]) return false;
if(!mark[i]&&!mark[i+1]){
cnt=0;
if(!dfs(i)){
while(cnt>0) mark[s[--cnt]]=0;
if(!dfs(i+1)) return false;
}
}
}
return true;
} void init()
{
REP(i,0,n*2) G[i].clear();
CLS(must,0);
CLS(mark,0);
} int main()
{
int k,cas=0;
char c;
while(scanf("%d%d",&n,&m)&&(n+m))
{
init();
CLS(flag,0);
while(m--)
{
scanf("%d",&k);
REP(i,0,k){
scanf("%d %c",&a[i],&c);
--a[i];
if(c=='y') b[i]=1;
else b[i]=0;
}
if(k<=2){
REP(i,0,k) must[a[i]*2+b[i]]=1;
}else
REP(i,0,k) REP(j,i+1,k) add(a[i],b[i],a[j],b[j]);
} REP(i,0,n+n) if(must[i]) dfs1(i); printf("Case %d: ",++cas);
REP(i,0,n){
if(must[i*2]||must[i*2+1]) continue;
clear();
mark[i*2]=1;
bool yy1=solve();
clear();
mark[i*2+1]=1;
bool yy2=solve();
if(yy1&&yy2) flag[i]=1;
}
clear();
if(!solve()){
printf("impossible\n");
continue;
}
REP(i,0,n){
if(flag[i]) printf("?");
else if(mark[i*2]) printf("n");
else printf("y");
}
printf("\n");
}
return 0;
}

  

UVALive-4452 The Ministers' Major Mess (2-SAT)的更多相关文章

  1. UVALive 4452 The Ministers' Major Mess(2-sat)

    2-sat.又学到了一种使用的方法:当确定选择某中状态A时,从它的对立状态A^1引一条边add(A^1,A),从而使凡是dfs经过对立状态,必然return false:即保证若存在一种可能性,必然是 ...

  2. UVaLive 4452 The Ministers' Major Mess (TwoSat)

    题意:有 m 个人对 n 个方案投票,每个人最多只能对其中的4个方案投票(其他的相当于弃权),每一票要么支持要么反对.问是否存在一个最终决定,使得每个投票人都有超过一半的建议被采纳,在所有可能的最终决 ...

  3. uvalive 4452 The Ministers’ Major Mess

    题意: 有一些部长需要对某些账单进行投票. 一个部长最多对4个账单进行投票,且每票对一个账单通过,要么否决. 问是否存在一个方案使得所有部长有超过半数的投票被通过,如果有,那么说明哪些账单的决定是明确 ...

  4. 【2-SAT】The Ministers’ Major Mess UVALive – 4452

    题目链接:https://cn.vjudge.net/contest/209474#problem/C 题目大意: 一共有m个提案,n个政客,每个政客都会对一些提案(最多四个)提出自己的意见——通过或 ...

  5. UVALive 5966 Blade and Sword -- 搜索(中等题)

    题意:给一幅地图,P为起点,D为终点,'*'为传送阵,到达传送阵可以传到任意一个其他的传送阵,传到以后可以正常走或者再传回来,问P->D最短步数. 分析:这题一定要细心,分析要到位才能搞定,错一 ...

  6. uva1086 The Ministers' Major Mess

    题意:有n 个议案,m 个大臣,每个大臣会对其中的ki 个议案投票,为赞成或反对.现要你判断是否存在一种方案,使得每个大臣有大于一半的投票被满足.若存在,还需判断某个议案是不是一定要通过,或者一定不能 ...

  7. 【UVALive - 3211】Now or later (二分+2-SAT)

    题意: 有n架飞机需要着陆.每架飞机有两种选择,早着陆或者晚着陆,二选其一.现在为了保证飞机的着陆安全,要求两架着陆的飞机的时间间隔的最小值达到最大. 分析: 最小值最大问题我们想到二分答案.对于猜测 ...

  8. POJ 3678 Katu Puzzle(2 - SAT) - from lanshui_Yang

    Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...

  9. 学习笔记(two sat)

    关于two sat算法 两篇很好的论文由对称性解2-SAT问题(伍昱), 赵爽 2-sat解法浅析(pdf). 一些题目的题解 poj 3207 poj 3678 poj 3683 poj 3648 ...

随机推荐

  1. Eclipse Tomcat插件的使用

    目录 Eclipse Tomcat插件的使用 Eclipse Tomcat插件的使用 我使用的Eclipse版本是:4.6.3 Eclipse已经自带Tomcat插件,不需要再自己进行安装 1.新建T ...

  2. zabbix debug and vulnerability https://www.zabbix.com/documentation/3.0/manual/concepts/sender

    https://www.zabbix.com/documentation/3.0/manual/concepts/sender zabbix--- zabbix_sender -vv -z 172.2 ...

  3. ubuntu ---QQ install/desktop/ibus reinstall

    http://www.linuxidc.com/Linux/2016-09/134923.htm ( Ubuntu 16.04安装QQ国际版图文详细教程) [ sudo apt-get install ...

  4. D.E.Shaw——高频统计套利交易获利41亿美元

    黑科技,还是要提 D.E.Shaw Research 这个奇异的存在. 要讲这个黑科技,我们可能要扯远一点,先讲讲 D.E. Shaw 这个人是怎么学术赚钱通吃,成为彻底的人生大赢家的. D.E.Sh ...

  5. 7.1 - CRM系统

    一.简介 crm 客户关系管理软件 ( Customer Relationship Management ) ( 详细内容 ) stark组件(仿admin组件)( 详细内容 ) rbac组件(基于角 ...

  6. centos 配置redis

    一.配置redis 简介:Redis是使用c语言开发的一个高性能键值数据库.Redis可以通过一些键值类型来存储数据. 下载:官网地址:http://redis.io/ 下载地址:http://dow ...

  7. (4.21)SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

    转自:指尖流淌 http://www.cnblogs.com/zhijianliutang/p/4100103.html SQL Server数据库启动过程(用户数据库加载过程的疑难杂症) 前言 本篇 ...

  8. 通过html<map>标签给图片加链接

    前面我们有谈到了通过图片定位给一张图片添加多个链接,现在用另外一种方法来实现,用html<map>标签给图片加链接 <img src="/images/hlj.jpg&qu ...

  9. Session应用之验证码

    package com.aeolia.view; import java.awt.Color; import java.awt.Font; import java.awt.image.Buffered ...

  10. Xcel 测试版使用手册

    基于无任何文笔可言,所以直接上使用方法吧. 1.引用dll,如何引用dll请谷歌. 2.使用 //实例化对象 LT.XMLExcel.XlsxOption xOption = new LT.XMLEx ...