博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LA 3713 Astronauts
阅读量:4958 次
发布时间:2019-06-12

本文共 1278 字,大约阅读时间需要 4 分钟。

给个题目链接:

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1714

显然每个人只有两种选择:C或者A/B。而且后一种只和这个人的年龄有关。

这就是一个很显然的2-SAT模型了,显然有矛盾的不能都选C,如果两个人的年龄段还一样,那就更悲剧了,也不能同时选A/B。

 

#include
#include
#include
#include
#include
#include
#include
#define pb push_back#define ll long long#define maxn 200005#define M(x) memset(x,0,sizeof(x))using namespace std;int n,m;struct TOW_SAT{ vector
g[maxn]; int tp[maxn],age[maxn]; int tot,node[maxn],num; bool mark[maxn<<1|1]; inline void init(){ for(int i=(n<<1)-1;i>=0;i--) g[i].clear(); M(tp),M(age); M(mark); tot=num=0; } inline void add(int x,int y){ int Cx=x<<1,Ax=Cx+1; int Cy=y<<1,Ay=Cy+1; g[Cx].pb(Ay),g[Cy].pb(Ax); if(tp[x]==tp[y]){ g[Ax].pb(Cy); g[Ay].pb(Cx); } } bool dfs(int x){ if(mark[x^1]) return 0; if(mark[x]) return 1; mark[x]=1,node[++num]=x; for(int i=g[x].size()-1;i>=0;i--) if(!(dfs(g[x][i]))) return 0; return 1; } inline bool work(){ int cl=n<<1; for(int i=0;i
=tot) tp[i]=1; int uu,vv; for(int i=1;i<=m;i++){ scanf("%d%d",&uu,&vv); uu--,vv--,add(uu,vv); } if(!work()) puts("No solution"); else{ for(int i=0;i

  

转载于:https://www.cnblogs.com/JYYHH/p/8448557.html

你可能感兴趣的文章
new与malloc的区别
查看>>
VS2010中水晶报表插件下载安装方法
查看>>
Nginx基本配置
查看>>
Spark WordCount的两种方式
查看>>
Django之视图
查看>>
NodeBB – 基于 Node.js 的开源论坛系统
查看>>
25幅非常漂亮的闪电摄影作品
查看>>
CAB框架 和 智能客户端简介 Composite Application Block and The Smart Client soft Factory
查看>>
JAVA手记 JAVA入门(安装+Dos下运行)
查看>>
[分组背包]ACboy needs your help
查看>>
<Android>日期,时间选择对话框
查看>>
MyBatis全局配置文件MyBatis-config.xml代码
查看>>
jquery tab插件精简版
查看>>
linux简单命令3
查看>>
.NET 3.5
查看>>
CV基础(1):计算机视觉概述
查看>>
3、生成证书请求文件
查看>>
Monkeyrunner 常用按键
查看>>
Linux 定时任务 crontab
查看>>
Harbor高可用
查看>>