uva1086 The Ministers' Major Mess
题意:有n 个议案,m 个大臣,每个大臣会对其中的ki 个议案投票,为赞成或反对。现要你判断是否存在一种方案,使得每个大臣有大于一半的投票被满足。若存在,还需判断某个议案是不是一定要通过,或者一定不能通过。
数据范围:n≤1000,m≤5000,1≤ki≤4
首先这是一些布尔变量的真假的问题,这让我们联想到2-SAT
仔细观察题意发现,k=1,2的时候所投的1个/2个提议的结果必须和投的票相同,k=3和4的时候最多允许有一个提议的结果和投的票不同.
因为2-SAT问题是对两个变量的约束,我们发现,如果k=3,某个人要求A,B,C三个变量至少两个为真,那么这三个变量中任意两个至少一个为真,也就是”A或B”,”B或C”,”A或C”
K=4的时候,添加6条限制即可.
接下来枚举每个变量的取值,分别添加某个变量必须为真/假的条件,用线性做法做2n次2-SAT,然后这样是卡在1s左右.我们发现,只要找出一个可行方案,就能对n个变量都给出一个可行的取值,然后就把2-SAT次数减少到了n次,就可以过了
吐槽:考试的题是单组数据,UVA上多组数据,输出格式还不一样…加初始化,改输出格式的时候挂了5次(最有趣的一次是考试的时候没有输出文末回车因为是单组数据没出事,多组数据的时候就成了每组数据的输出之间没有回车…)
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=,maxm=;
struct edge{
int to,next;
}lst[maxm],lst2[maxm];int len=,first[maxn],len2=,first2[maxn];
void addedge(int a,int b){//printf("%d %d\n",a,b);
lst[len].to=b;lst[len].next=first[a];first[a]=len++;
}
void addedge2(int a,int b){//printf("%d->%d\n",a,b);
lst2[len2].to=b;lst2[len2].next=first2[a];first2[a]=len2++;
}
int conv[maxn][];int ok[maxn][];
void AddTrue(int x){
addedge(conv[x][],conv[x][]);
}
void AddFalse(int x){
addedge(conv[x][],conv[x][]);
}
void AddOr(int x1,int t1,int x2,int t2){
addedge(conv[x1][t1^],conv[x2][t2]);addedge(conv[x2][t2^],conv[x1][t1]);
}
int n,m,k;
int a[],b[];char buf[];
int s[maxn],top,dfn[maxn],low[maxn],belong[maxn],tot,T;
bool ins[maxn];
void dfs(int x){
s[top++]=x;ins[x]=true;
dfn[x]=low[x]=++T;
for(int pt=first[x];pt;pt=lst[pt].next){
if(!dfn[lst[pt].to]){
dfs(lst[pt].to);
if(low[lst[pt].to]<low[x])low[x]=low[lst[pt].to];
}else if(ins[lst[pt].to]&&dfn[lst[pt].to]<low[x])low[x]=dfn[lst[pt].to];
}
if(low[x]==dfn[x]){
++tot;
do{
ins[s[--top]]=false;belong[s[top]]=tot;
}while(s[top]!=x);
}
}
bool Tarjan(){
memset(dfn,,sizeof(dfn));T=;tot=;
for(int i=;i<=n;++i){
if(!dfn[conv[i][]])dfs(conv[i][]);
if(!dfn[conv[i][]])dfs(conv[i][]);
if(belong[conv[i][]]==belong[conv[i][]])return false;
}
return true;
} int sz[maxn];int choose[maxn];bool vis[maxn];
int toposeq[maxn];int cnt=;
void toposort(int x){
if(vis[x])return;
vis[x]=true;
for(int pt=first2[x];pt;pt=lst2[pt].next){
toposort(lst2[pt].to);
}
toposeq[++cnt]=x;
}
int neg(int x){
return (x&)?(x+):(x-);
}
void get_solution(){
vector<int> scc[maxn];
int lim=*n;cnt=;
for(int i=;i<=lim;++i)sz[belong[i]]++,scc[belong[i]].push_back(i);
for(int i=;i<=lim;++i){
for(int pt=first[i];pt;pt=lst[pt].next){
if(belong[i]!=belong[lst[pt].to]){
addedge2(belong[i],belong[lst[pt].to]);
}
}
}
for(int i=;i<=tot;++i){
if(!vis[i])toposort(i);
}
for(int i=;i<=cnt;++i){
int x=toposeq[i];int flag=;//printf("%d\n",x);
if(choose[x]!=)continue;
for(int pt=first2[x];pt;pt=lst2[pt].next){
if(choose[lst2[pt].to]==-){
flag=-;break;
}
}
choose[x]=flag;
for(int j=;j<sz[x];++j){
choose[belong[neg(scc[x][j])]]=-flag;
}
}//printf("%d %d\n",choose[belong[conv[2][0]]],choose[belong[conv[2][1]]]);
for(int i=;i<=n;++i){
if(choose[belong[conv[i][]]]==){
ok[i][]=;
}else{
ok[i][]=;
}
}
}
void work(){
for(int i=n;i>=;--i){
for(int k=;k<;++k){
if(ok[i][k]==)continue;
int tmp=first[conv[i][k^]];
if(k==)AddTrue(i);
else AddFalse(i);
if(Tarjan()){
ok[i][k]=;
}
len--;
first[conv[i][k^]]=tmp;
}
}
}
int main(){
int t=;
while(scanf("%d%d",&n,&m),n!=){ memset(first,,sizeof(first));len=;memset(first2,,sizeof(first2));len2=;
memset(conv,,sizeof(conv));memset(ok,,sizeof(ok));
memset(choose,,sizeof(choose));memset(vis,,sizeof(vis));
memset(sz,,sizeof(sz));
for(int i=;i<=n;++i){
conv[i][]=*i-;conv[i][]=*i-;
}
for(int i=;i<=m;++i){
scanf("%d",&k);
for(int j=;j<=k;++j){
scanf("%d",&a[j]);
scanf("%s",buf);
if(buf[]=='y')b[j]=;
else b[j]=;
}
if(k==){
if(b[]==)AddTrue(a[]);
else AddFalse(a[]);
}else if(k==){
for(int j=;j<=;++j){
if(b[j]==)AddTrue(a[j]);
else AddFalse(a[j]);
}
}else{
for(int j=;j<=k;++j){
for(int l=j+;l<=k;++l){
AddOr(a[j],b[j],a[l],b[l]);
}
}
}
}
printf("Case %d: ",++t);
if(Tarjan()){
get_solution();
work();
for(int i=;i<=n;++i){
if(ok[i][]==&&ok[i][]==)printf("?");
else printf("%c",(ok[i][]==)?'n':'y');
}printf("\n");
}else{
puts("impossible");
}
}
return ;
}
uva1086 The Ministers' Major Mess的更多相关文章
- UVALive 4452 The Ministers' Major Mess(2-sat)
2-sat.又学到了一种使用的方法:当确定选择某中状态A时,从它的对立状态A^1引一条边add(A^1,A),从而使凡是dfs经过对立状态,必然return false:即保证若存在一种可能性,必然是 ...
- uvalive 4452 The Ministers’ Major Mess
题意: 有一些部长需要对某些账单进行投票. 一个部长最多对4个账单进行投票,且每票对一个账单通过,要么否决. 问是否存在一个方案使得所有部长有超过半数的投票被通过,如果有,那么说明哪些账单的决定是明确 ...
- UVaLive 4452 The Ministers' Major Mess (TwoSat)
题意:有 m 个人对 n 个方案投票,每个人最多只能对其中的4个方案投票(其他的相当于弃权),每一票要么支持要么反对.问是否存在一个最终决定,使得每个投票人都有超过一半的建议被采纳,在所有可能的最终决 ...
- UVALive-4452 The Ministers' Major Mess (2-SAT)
题目大意:有n个问题,m个人来投票,没人最多投4票,问该怎样决定才能使每个人都有超过一半的票数被认可? 题目分析:2-SAT问题.如果某个人投的票数少于2,则这两票军被采纳,如果票数至少三票,则最多有 ...
- 【2-SAT】The Ministers’ Major Mess UVALive – 4452
题目链接:https://cn.vjudge.net/contest/209474#problem/C 题目大意: 一共有m个提案,n个政客,每个政客都会对一些提案(最多四个)提出自己的意见——通过或 ...
- 记一次jdk升级引起的 Unsupported major.minor version 51.0
之前jdk 一直是1.6,tomcat 是6.x 版本,, 现在引入的新的jar, 出现 Caused by: java.lang.UnsupportedClassVersionError: org/ ...
- 解决Unsupported major.minor version 51.0错误
解决Unsupported major.minor version 51.0错误使用jdk6运行项目时发生了Unsupported major.minor version 51.0错误.经过网上搜索发 ...
- Unsupported major.minor version 51.0
org/jboss/as/domain/management/security/adduser/AddUser : Unsupported major.minor version 51. 0 已编译好 ...
- Unsupported major.minor version 52.0问题的解决
下载Tomcat9.0,解压后安装运行,结果启动失败,进入logs文件夹看里面的日志文件,提示是Unsupported major.minor version 52.0错误,这是因为Tomcat版本过 ...
随机推荐
- 【转】odoo学习之:Environment
Environment类提供了对ORM对象的封装,同时提供了对注册类的访问,记录集的缓存,以及管理重计算的数据结构. 对于继承了Model的类来说可以直接通过self.env对Environment进 ...
- 北京Uber优步司机奖励政策(12月2日)
用户组:人民优步(适用于12月2日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:htt ...
- C#中创建二维数组,使用[][]和[,]的区别
C#中,我们在创建二维数组的时候,一般使用arr[][]的形式,例如 int[][] aInt = new int[2][]; 但声明二维数组还有一种方法,是使用arr[,]的形式.两者有什么区别呢? ...
- Qt-QML-ComboBox-自定义,实现状态表示,内容可以动态正价,使用ListModel
哎呀呀呀, 问:杀死一个程序员一个程序要需要进步? 答:改三次需求 我感觉我就要再这需求的变更中被杀死了.不管怎么说,总是要跟着需求走的的,客户才是第一么(要不是因为钱,我才不会了) 下面先上个效果 ...
- Unity编辑器 - 资源修改立即写入磁盘AssetDataBase.SaveAssets()
Unity编辑器 - 资源修改立即写入磁盘AssetDataBase.SaveAssets() 在编写编辑器时,如果需要修改Unity序列化资源(如Prefab,美术资源,ScriptableObje ...
- 在Unity中使用LitJson解析json文件
LitJson 这个库需要找资源,找到LitJson.dll后将它放在Assets文件夹下,在脚本中使用using引入即可 测试代码 json文件: {"Archice":[{&q ...
- 【WXS全局对象】Date
属性: 名称 说明 Date.parse( [dateString] ) 解析一个日期时间字符串,并返回 1970/1/1 午夜距离该日期时间的毫秒数. Date.UTC(year,month,day ...
- HTML+JS = 网站注册界面源代码
本注册页面未设置编码方式和兼容性,已测试,在Chrome浏览器显示正常 <!DOCTYPE html> <html> <head> <title>注册页 ...
- Flex 布局浅析
除了 CSS 中传统的布局系统之外,CSS3还提供了一个新布局系统.在这个新的框模型中,框的子代采用水平或垂直布局,而且可将未使用的空间分配给特定的子代,或者通过“弹性”分配给应展开的子代,在各子代间 ...
- html常用小知识
请求重定向:加载页面之后,除了用js做重定向之外,我们还可以直接用<meta>标签做重定向. <meta http-equiv="refresh" content ...