UVA Live 3713 Astronauts

用布尔变量表示状态,把限制条件转化为XνY的形式以后跑2SAT,根据变量取值输出方案。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;

#define PB push_back
bool vis[maxn*2];
vector<int> G[maxn*2];
int N,S[maxn*2],top;
void initGraph(int n)
{
    N = n*2;
    for(int i = 0; i < N; i++) G[i].clear();
    memset(vis,0,sizeof(bool)*(n<<1|1));
}

bool dfs(int x)
{
    if(vis[x^1]) return false;
    if(vis[x]) return true;
    vis[x] = true;
    S[top++] = x;
    for(int i = 0; i < (int)G[x].size(); i++){
        if(!dfs(G[x][i])) return false;
    }
    return true;
}

bool twoSAT()
{
    for(int i = 0; i < N; i+=2){
        if(!vis[i]&&!vis[i^1]){
            top = 0;
            if(!dfs(i)){
                while(top>0) vis[S[--top]] = false;
                if(!dfs(i^1)) return false;
            }
        }
    }
    return true;
}

void add_clause(int x,int xv,int y,int yv)
{
    x = x<<1|xv;
    y = y<<1|yv;
    G[x^1].PB(y);
    G[y^1].PB(x);
}

int tp[maxn];
int age[maxn];
char bin[2][2] = {{‘C‘,‘B‘},{‘C‘,‘A‘}};

int main()
{
    //freopen("in.txt","r",stdin);
    int n,m;
    while(scanf("%d%d",&n,&m),n){
        int sum = 0;
        for(int i = 0; i < n; i++){
            scanf("%d",age+i);
            sum += age[i];
        }
        for(int i = 0; i < n; i++){
            if(age[i]*n >= sum) tp[i] = 1;
            else tp[i] = 0;
        }
        initGraph(n);
        for(int i = 0; i < m; i++){
            int u,v; scanf("%d%d",&u,&v);
            if(tp[--u]^tp[--v]){
                add_clause(u,1,v,1);
            }else {
                add_clause(u,0,v,0);
                add_clause(u,1,v,1);
            }
        }
        if(twoSAT()){
            for(int i = 0; i < N; i+=2){
                putchar(bin[tp[i>>1]][vis[i^1]]);
                putchar(‘\n‘);
            }
        }else {
            puts("No solution.");
        }
    }
    return 0;
}
时间: 2024-08-10 21:29:18

UVA Live 3713 Astronauts的相关文章

UVALive 3713 Astronauts

题意: 有n个宇航员  他们需要完成A.B.C三种任务  年龄>=平均年龄的人可以做A和C  年龄<平均年龄的能做B和C  且宇航员之间有讨厌关系不能一起做任务  要求给出一种分配方案 思路: 一类人有2种选择而且必须选1个  因此想到2-sat  根据年龄和讨厌关系来建边  之后先做可行性判断  确定可以后  求出任意一组可行解  不需要字典序最小 代码: #include<cstdio> #include<cstring> #include<algorithm

UVALive 3713 Astronauts (2-SAT,变形)

题意:有A,B,C三种任务,每个人必获得1个任务,大于等于平均年龄的可以选择A和C,小于平均年龄的可以选择B和C.这些人有一些是互相讨厌的,必须不能执行同任务,问能否安排他们工作?若行,输出任意一组解. 思路: 依然是 2-SAT,只不过换了个样子,建图时不同而已.这里每个人依然有2人选择,也有冲突的出现,问题在如何找出冲突. 首先,无论是哪两人,只要互相讨厌,去抢C,必定冲突.其次,如果是同龄人(同大于等于,或同小于),那么抢他们那个年龄段的任务也会冲突.所以共计2种,每种2条边,即我选的时候

UVALive - 3713 Astronauts(2-SAT)

题目大意:有A,B,C 3个任务要飞配给n个宇航员,现给出n个宇航员的年龄和每种任务的执行要求. A任务只有年龄大于等于平均年龄的宇航员才可以执行 B任务只有年龄小于平均年龄的宇航员才可以执行 C任务任何宇航员都可以执行 现在有M对讨厌关系,互相讨厌的宇航员不能执行同一种任务,现要求找出一个满足上述所有要求的任务分配方案 解题思路:年龄大于等于平均年龄的宇航员只能执行A任务或者C任务,假设执行A任务为true 同理,年龄小于平均年龄的宇航员只能执行B任务或者C任务,假设执行B任务为true 如果

LA 3713 Astronauts

给个题目链接: 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<iostream> #incl

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. 在实际操

UVA 1391 - Astronauts(2-SET)

UVA 1391 - Astronauts 题目链接 题意:给定一些宇航员,年龄小于平均数能做A和C,大于等于能做B和C,现在知道一些宇航员互相憎恨,不能让他们做同一个任务,问一直种安排方法满足条件 思路:2set问题,如果两种宇航员类型相同,就两个宇航员做不一样,加一条真或真,和假或假的边,如果类型不同,就加一条真或真的边 代码: #include <cstdio> #include <cstring> #include <cstdlib> #include <

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或

uva 1391 Astronauts(2-SAT)

/*翻译好题意 n个变量 不超过m*2句话*/ #include<iostream> #include<cstdio> #include<cstring> #include<vector> #define maxn 200010 using namespace std; int n,m,f[maxn],c,s[maxn],age[maxn],sum,a,b; vector<int>G[maxn]; bool Judge(int a,int b)

LA 3713

The Bandulu Space Agency (BSA) has plans for the following three space missions: Mission A: Landing on Ganymede, the largest moon of Jupiter. Mission B: Landing on Callisto, the second largest moon of Jupiter. Mission C: Landing on Titan, the largest