2-SAT问题(宇航员分组,LA 3713)
来源:互联网 发布:linux命令解压缩 编辑:程序博客网 时间:2024/05/21 17:40
一共有三种任务,但是每个宇航员只能在其中某两种中选择一种。满足2-SAT模型的建模以及算法原理。(即每个人只能二选一)有向边uv表示选了u就要选v,这是一种限制而不是要求,所以我们依然可以把互相厌恨的条件满射成某些有向边。剩下的区别就只是搜索的时候加多一些讨论罢了。(比如dfs的失败条件不再是已经标记了另一个任务,而是另两个任务。)
防止精度问题可用乘法判断。
代码
#include<bits/stdc++.h>using namespace std;const int maxn = 100010;struct SAT3{ int n; int N; vector<int>G[maxn*3]; int mark[maxn*3]; int s[maxn*3],c; int age[maxn]; int sum; void add(int u,int v) { int U=u*3; int V=v*3; int bu=age[u]*n>=sum?1:0; int bv=age[v]*n>=sum?1:0; if(bu==bv) { G[U+(bu^1)].push_back(V+2); G[V+2].push_back(U+(bu^1)); G[V+(bv^1)].push_back(U+2); G[U+2].push_back(V+(bv^1)); } else { G[V+2].push_back(U+(bu^1)); G[U+2].push_back(V+(bv^1)); } } void Read(int n,int m) { this->n=n; N=n*3; c=sum=0; for(int i=0;i<N;i++) { G[i].clear(); mark[i]=0; } for(int i=0;i<n;i++) { scanf("%d",&age[i]); sum+=age[i]; } int u,v; while(m--) { scanf("%d %d",&u,&v); u--;v--; add(u,v); } } bool dfs(int u) { int temp=u%3; if(mark[u-temp+(temp+1)%3]||mark[u-temp+(temp+2)%3]) return false; if(mark[u]) return true; mark[u]=true; s[c++]=u; for(unsigned int i=0;i<G[u].size();i++) if(!dfs(G[u][i])) return false; return true; } bool solve() { for(int i=0;i<N;i+=3) { if(!mark[i]&&!mark[i+1]&&!mark[i+2]) { c=0; int bi=age[i/3]*n>=sum?1:0; if(!dfs(i+(bi+1)%3)) { while(c>0) mark[s[--c]]=0; if(!dfs(i+(bi+2)%3)) return false; } } } return true; } void print() { //printf("%lf\n",1.0*sum/n); for(int i=0;i<N;i+=3) printf("%c\n",mark[i]?'A':mark[i+1]?'B':'C'); }};SAT3 S3;int main(){ int n,m; while(scanf("%d %d",&n,&m)==2&&n&&m) { S3.Read(n,m); if(S3.solve()) S3.print(); else puts("No solution."); } return 0;}
0 0
- 2-SAT问题(宇航员分组,LA 3713)
- 宇航员分组,白书P326LA3713(2-SAT算法)
- 【UVa1391】宇航员分组Astronauts【2-SAT】【强连通分量】
- LA 3713 - Astronauts 2-SAT
- LA 3713 Astronauts(2-SAT)
- LA 3211 Now or Later(2-SAT问题)
- 2-SAT问题(飞机调度,LA 3211)
- LA 3211 Now or later (2 - SAT) - from lanshui_Yang
- LA 3211 Now or later(2-SAT)
- 例题5.10 宇航员分组 LA3713
- LA 3211 Now or later / 2-SAT
- Uva1 1391/LA 3713 - Astronauts 构图2-sat...更正了toposort过程...
- LA 4452 The Ministers' Major Mess(2-SAT)
- LA 3211 Now or later (2-SAT + 二分)
- LA 3514 The Ministers' Major Mess(2-SAT)
- POJ1835 宇航员(模拟)
- 宇航员
- 宇航员
- 【POJ2778】【AC自动机】【矩阵快速幂】17.2.9 T2 DNA Sequence 题解
- Android 中 RGB 参数的意义
- JAVA索引硬盘目录
- WeChat学习第一篇:natapp使用
- js数组排序
- 2-SAT问题(宇航员分组,LA 3713)
- #193. 字符串查询
- cdh安装最少需要几个库
- 博客迁移备忘
- gradle教程
- 形状特征提取-七个不变矩--matlab实现
- 面试基础题--J2SE基础
- Mongodb概述(三)
- 数字三角形问题