UVALive-4452 The Ministers' Major Mess (2-SAT)
2024-08-24 20:29:38
题目大意:有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;
}
最新文章
- volatile用法
- HDU 2222 Keywords Search (AC自动机)
- inittab 分析
- android 中 webview 怎么用 localStorage?
- FreeSwitch安装配置记录
- android: PendingIntent的使用
- zabbix监控MySQL
- 三层交换机+二层交换机配置VLAN相互访问
- linux下如何安装配置redis及主从配置
- ACM - ICPC World Finals 2013 B Hey, Better Bettor
- ArrayList、Vactor以及LinkList的区别
- 从头编写 asp.net core 2.0 web api 基础框架 (2)
- C之多线程(例子很不错)
- C# call webservice方法
- Java Web之JSP
- 为jqweui增加selectcallback方法
- nodejs sass安装报错一招解决
- Amber中的一些option设置及名词
- slack机器人运维
- [SQLServer] 内存占用查看
热门文章
- 解决“The remote certificate is invalid according to the validation procedure”问题
- Elasticsearch之settings和mappings(图文详解)
- MTA---smtp(25,postfix,sendmail),Pop3(110,Devocot), MUA(foxmail) IMAP(server,client rsync)
- SSL/TSL握手过程详解
- spring boot开启事务管理,使用事务的回滚机制,使两条插入语句一致
- 三、Mosquitto Java 客户端实现
- 关于ML的思考讲座-周zh-11.30日
- c/c++值传递和引用传递
- (28)Cocos2d-x xml解析
- 1:1 Struts2概述