UVA1391 Astronauts(ACM - ICPC 2006 Europe - Central)(2 - SAT问题、输出方案)
虽然题目里有A、B、C三种状态,但是每个人只有两个状态可以选择,显然是一道2-SAT; 建图的话,假设选择A(或者B)为i+n,选择C为i;首先当两个人讨厌时,一个人选C,则另一个一定选另一个,连两条边(x,y+n)和(y,x+n),同时若是两个人同类,则还需加上限制使两个人不能同时选A(或同时选B),就再连两条边(x+n,y),(y+n,x);最后跑一边tarjan
输出答案的话就不需要在跑一边拓扑排序了,因为在tarjan时强连通分量被染色的顺序就是拓扑序,所以若col(i)<col(i+n),就表示选择A(或B),否则选C。
注意一个坑,2SAT问题中如果要求你输出方案,如果你的代码输出的跟样例不一样,不要着急,因为2SAT 问题本来就是有多解,结果我样例不过,交上去就A了
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>using namespace std;
typedef long long ll;
const int N = 5000007, M = 5000007, INF = 0x3f3f3f3f;int n, m;
int dfn[N], low[N], num;
int head[N], ver[M], nex[M], tot;
int stk[N], top;
bool ins[M];
int scc_cnt;
int color[N];void init()
{memset(head, -1, sizeof head);memset(dfn, 0, sizeof dfn);memset(low, 0, sizeof low);memset(color, 0, sizeof color);tot = num = scc_cnt = 0;
}int age[N];void add(int x, int y)
{ver[tot] = y;nex[tot] = head[x];head[x] = tot ++ ;
}void tarjan(int x)
{dfn[x] = low[x] = ++num;stk[++ top] = x;ins[x] = 1;for(int i = head[x]; ~i; i = nex[i]){int y = ver[i];if(!dfn[y]){tarjan(y);low[x] = min(low[x], low[y]);}else if(ins[y])low[x] = min(low[x], dfn[y]);}if(low[x] == dfn[x]){int y;++scc_cnt;color[x] = scc_cnt;do{y = stk[top -- ];ins[y] = false;color[y] = scc_cnt;}while(x != y);}
}
int main()
{while(scanf("%d%d", &n, &m)!= EOF && n + m){init();int sum = 0;for(int i = 1;i <= n; ++ i){scanf("%d", &age[i]);sum += age[i];}for(int i = 1; i <= n; ++ i){age[i] = (age[i] * n >= sum);}for(int i = 1; i <= m; ++ i){int p, q;scanf("%d%d", &p, &q);//i + n : A / B//i : B / Cif(age[p] == age[q])add(p + n, q), add(q + n, p);add(p, q + n),add(q, p + n);}for(int i = 1; i <= 2 * n; ++i){if(!dfn[i])tarjan(i);}bool flag = 1;for(int i = 1; i <= n; ++ i){if(color[i] == color[i + n]){puts("No solution."), flag = 0;break;}}if(!flag)continue;for(int i = 1; i <= n; ++ i){//谁小选谁 i + n 小的话,就是 i + n : A / Bif(color[i] > color[i + n]){if(age[i])//根据题意1为大于平均值x,选A,B中的Aputs("A");else puts("B");}else puts("C");}}return 0;
}
UVA1391 Astronauts(ACM - ICPC 2006 Europe - Central)(2 - SAT问题、输出方案)相关推荐
- ACM/ICPC 集:
ACM/ICPC在线题库集锦: 网址:http://acm.uva.es/ 简称: uva 全称: Valladolid Programming Contest Site 所在国:西班牙 提交方式:w ...
- PKU ACM/ICPC竞赛队最近八年比赛成绩
PKU ACM/ICPC竞赛队最近八年比赛成绩 (不含预选赛前十名以外) 竞赛名称 年度 获奖名次 学生姓名 备 注 第29届ACM国际 大学生程序设计竞赛 亚洲区预选赛 2004 北京赛区第4名 饶 ...
- 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 2019 ACM - ICPC 西安邀请赛 B. Product (杜教筛) 简单数论(bushi)
G.(2019 ACM/ICPC 全国邀请赛(西安)B) Product Weblink https://nanti.jisuanke.com/t/39269 Problem && S ...
- 解题报告(一)F、(2018 ACM - ICPC shenyang I)Distance Between Sweethearts(数学期望 + 乘法原理 + FWT)(4.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 2016 ACM / ICPC Asia dalian Regional Contest 题解(11 / 11)【每日亿题2021 / 2 / 17】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A .(2017 ACM ICPC dalian H)To begin or not to be ...
- P5801 [SEERC2019]Game on a Tree(ACM - ICPC 2019)(树的最大匹配)(完美匹配)
P5801 [SEERC2019]Game on a Tree(ACM - ICPC 2019)(树的最大匹配) 完美匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配. #i ...
- 例题6-2 铁轨(Rails, ACM/ICPC CERC 1997, UVa 514)
栈应用 例题6-2 铁轨(Rails, ACM/ICPC CERC 1997, UVa 514) 错解 1.每次要把栈清空 2.不能用空的栈(栈顶)去比较 #include<iostream&g ...
- Problem 1002-2017 ACM/ICPC Asia Regional Shenyang Online
网络赛:2017 ACM/ICPC Asia Regional Shenyang Online 题目来源:cable cable cable Problem Description: Connecti ...
最新文章
- 一篇带你了解TCP/IP 概念
- affectnet数据集_处理表情识别中的坏数据:一篇CVPR 2020及两篇TIP的解读
- 201521123111《Java程序设计》第14周学习总结
- 你们应该听说过”w8ay“这个ID吧!一个喜欢造轮子的小子
- linux下的静态库与动态库
- oracle索引分类与区分,深入理解Oracle表(6):堆组织表(HOT)和索引组织表(IOT)的区别...
- 产品壁垒_打破人员,流程和产品之间的壁垒
- django 使用原生SQL语句反向生成MODELS.PY中的表结构
- Linux 命令之 scp 文件传输
- 基于Python和MySQL的学生信息管理系统
- eclipse中文语言包安装
- java deff_java – 在配置中添加时出现Spring NoClassDefF...
- MYS-6ULX-IOT 开发板测评——Yocto 创建嵌入式 Linux 发行版
- 如何修改PDF文件的标题
- 港美股交易系统开发框架构造简述篇
- 社会心理学第四章 态度与行为
- 手游服务器技术的选择
- ads的项目下的文件全部消失不见了
- 北漂去帝都大医院求医到底有多难?我的真实经历,真的是一路坎坷与辛酸~
- Vlan 单线复用之复式二层住宅网络改造实操案例(一)