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版本过 ...
随机推荐
- Milking Order
Milking Order 题意:给出m个描述状态,其中包含若干个边的关系,问最多能取x (x<=m)个状态,使得形成的图没有环.就是说取x个状态,用状态中的关系建边,其中不能有环. 题解:最大 ...
- 20145209刘一阳《JAVA程序设计》第1周学习总结
20145209刘一阳<JAVA程序设计>第1周学习总结 本周任务 了解Java基础知识 了解JVM.JRE与JDK,并下载.安装.测试JDK 了解PATH.CLASSPATH.SOURC ...
- DSP5509之采样定理
1. 在实际种信号是模拟连续的,但是AD采样确实离散的数字的,根据采样定理,采样频率要是模拟信号的频率2倍以上采样到的值才没问题. 2. 打开工程 unsigned ]; main() { int i ...
- 图片文件转换成Base64编码实现ajax提交图片
//上传头像图片 function uploadHead(imgPath) { console.log("imgPath = " + imgPath); var image = n ...
- iOS SSL Pinning 保护你的 API
随着互联网的发展,网站全面 https 化已经越来越被重视,做为 App 开发人员,从一开始就让 API 都走 SSL 也是十分必要的.但是光这样就足够了吗? SSL 可以保护线上 API 数据不被篡 ...
- JAVA FILE.renameTo跨文件系统移动文件失败
遇到了FILE.renameTo跨文件系统移动文件失败的问题,应使用FILES.move()接口或在同一文件系统移动文件. FILE.renameTo接口说明: public boolean rena ...
- RabbitMQ基础教程之使用进阶篇
RabbitMQ基础教程之使用进阶篇 相关博文,推荐查看: RabbitMq基础教程之安装与测试 RabbitMq基础教程之基本概念 RabbitMQ基础教程之基本使用篇 I. 背景 前一篇基本使用篇 ...
- 人艰不拆之破解低版本IE不兼容mediaQuery
先放个链接 大家预览下 http://scottjehl.github.io/Respond/test/test.html 值得注意的是 将页面源代码下载到本地时,直接用IE打开是没有效果的.需要把静 ...
- 安卓客户端浏览器ajax注意
这两天被一个bug搞疯了,就是公司安卓app上我负责的网页死活不进ajax,一开始我用的是post方式提交的,但是参数那一栏没写,直接把参数写在url上了,后来老大跟我说post不写参数会出问题,后来 ...
- Laxcus大数据管理系统2.0(6)- 第四章 数据计算
第四章 数据计算 Laxcus所有数据计算工作都是通过网络实施.相较于集中计算,在网络间进行的数据计算更适合处理那些数据量大.复杂的.耗时长的计算任务.能够实施网络计算的前提是数据可以被分割,就是把一 ...