UVA1391 Astronauts(LA3713)
来源:互联网 发布:ip广播软件下载 编辑:程序博客网 时间:2024/06/11 21:44
前几天一直做这道题,但是硬是没过,今天再做就A了
刘汝佳提供的代码是wrong的,但是也没找到错在哪,希望有心人找到错后提醒下在下!
每个宇航员都只对应一对A和C或者B和C,因此我们只记两个点为C和非C
对于每一对矛盾的人,一个选C另一个就只能选择非C,即C1->非C2和C2->非C1;
如果他们年龄段相同时,一个人选择非C则另一个人只能选择C,即非C1->C2和非C2->C1;(这两条边不一定有)
这样每一对矛盾都能组成两条边或者四条边
建好图以后就是典型的2-SAT问题了,用DFS来实现!
#include <stdio.h>#include <string.h>#include <vector>using namespace std;const int maxn = 100000+10;vector<int> adj[maxn*2];bool flag[maxn*2];bool eld[maxn];//true表示年龄够了int N, M, age[maxn];int myStack[maxn*2], top;//第i个人占2*i和2*i+1, 2*i表示A和B, 2*i+1表示Cvoid Init(){ for(int i = 1; i <= N; i++) { adj[2*i].clear(), adj[2*i+1].clear(); flag[2*i] = false, flag[2*i+1] = false; } int sum = 0; for(int i = 1; i <= N; i++) { scanf("%d", &age[i]); sum += age[i]; } for(int i = 1; i <= N; i++) if(age[i] * N < sum)//年轻 eld[i] = false; else eld[i] = true; int a, b; for(int i = 1; i <= M; i++) { scanf("%d%d", &a, &b);//a和b兄弟,a兄弟和b adj[2*a+1].push_back(2*b); adj[2*b+1].push_back(2*a);//任何一个选了c另一个只能选另一个 if(eld[a] == eld[b])//若年龄段相同 { adj[2*a].push_back(2*b+1); adj[2*b].push_back(2*a+1); } }}bool DFS(int cur){ int sibling = cur^1; if(flag[sibling]) return false; if(flag[cur]) return true; flag[cur] = true; myStack[top++] = cur; for(vector<int>::iterator it = adj[cur].begin(); it != adj[cur].end(); it++) if(!DFS(*it)) return false; return true;}void Resolve(){ while(top != 0) { int ans = myStack[--top]; flag[ans] = false; }}bool Solve(){ for(int i = 1; i <= N; i++) { if(flag[2*i] || flag[2*i+1]) continue; top = 0; if(!DFS(2*i)) { Resolve();//还原所选 if(!DFS(2*i+1)) return false; } } return true;}int main(){ while(scanf("%d%d", &N, &M) != EOF && N+M) { Init(); if(!Solve()) printf("No solution.\n"); else { for(int i = 1; i <= N; i++) { if(flag[2*i+1]) printf("C\n"); else if(!eld[i])//年轻 printf("B\n"); else printf("A\n"); } } } return 0;}
- UVA1391 Astronauts(LA3713)
- UVA1391、LA3713【astronauts...】【2 -SAT】
- LA3713 Astronauts
- uva1391 - Astronauts 2-SAT
- LA3713--Astronauts(2-sat)
- La3713 Astronauts 2-Sat
- UVA1391【LA3713】 经典2-SAT
- 【UVa1391】宇航员分组Astronauts【2-SAT】【强连通分量】
- UVALive3713 Astronauts
- 【2-sat】uva1391
- 2-SAT问题(LA3713)
- 例题5.10 宇航员分组 LA3713
- UvaLive-3713-Astronauts
- UVALive 3713 Astronauts
- LA 3713 Astronauts
- UVALive - 3713 Astronauts
- UVALive 3713 Astronauts
- UVALive3713-Astronauts(2-SAT)
- 中国城市数据 上下级关系 区号 邮编 entity by jpa
- Nginx配置文件详细说明
- linux删除百万数据方法
- coroutines(协程)
- windows环境下配置python脚本的开机启动
- UVA1391 Astronauts(LA3713)
- 如何高效、准确、自动识别网页编码
- 【转】Extjs Store 的一些用法
- 服务器集群测试积累【更新】
- New Flock Browser Based On Chromium
- locate命令无效问题
- python reload
- 结构型模式:Adapter(适配器)
- Struts2.0中Action直接返回字符串