2-sat。。。求解2-sat方案直接每个变量枚举就行了,lrj的代码很靠谱。。。

#include<bits/stdc++.h>
using namespace std;
const int N = ;
struct edge {
int nxt, to;
} e[N << ];
int n, m, x, cnt, top;
bool mark[N];
int head[N], u[N], v[N], age[N], st[N];
void Init()
{
cnt = ; top = x = ;
memset(head, , sizeof(head));
memset(mark, false, sizeof(mark));
}
void link(int u, int v)
{
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].to = v;
}
bool dfs(int u)
{
if(mark[u ^ ]) return false;
if(mark[u]) return true;
mark[u] = true; st[++top] = u;
for(int i = head[u]; i; i = e[i].nxt) if(!dfs(e[i].to)) return false;
return true;
}
bool solve()
{
for(int i = ; i <= * n + ; i += ) if(!mark[i] && !mark[i + ])
{
top = ;
if(!dfs(i))
{
while(top) mark[st[top--]] = false;
if(!dfs(i + )) return false;
}
}
return true;
}
int main()
{
while(scanf("%d%d", &n, &m))
{
if(n == && m == ) break;
Init();
for(int i = ; i <= n; ++i) scanf("%d", &age[i]), x += age[i];
for(int i = ; i <= m; ++i)
{
int u1, v1, u2, v2; scanf("%d%d", &u[i], &v[i]);
u1 = u[i] << ; u2 = u1 + ; v1 = v[i] << ; v2 = v1 + ;
if(age[u[i]] * n >= x)
{
if(age[v[i]] * n >= x) link(u2, v1), link(v1, u2), link(u1, v2), link(v2, u1);
if(age[v[i]] * n < x) link(u1, v2), link(v1, u2);
}
else
{
if(age[v[i]] * n >= x) link(u1, v2), link(v1, u2);
if(age[v[i]] * n < x) link(u1, v2), link(v2, u1), link(u2, v1), link(v1, u2);
}
}
if(!solve()) { puts("No solution."); continue; }
for(int i = ; i <= n; ++i)
{
if(mark[i * ]) puts("C");
else if(age[i] * n >= x) puts("A");
else puts("B");
}
}
return ;
}

la3713的更多相关文章

  1. UVA1391/LA3713 Astronauts

    题意:有A.B.C3个任务分配给n个宇航员,其中每个宇航员恰好分配一个任务.假设n个宇航员的平均年龄为x,只有年龄大于x的才能领取A任务:只有年龄严格小于x的才能领取B任务,而任务C没有限制.有m对宇 ...

  2. 【LA3713 训练指南】宇航员分组 【2-sat】

    题意 有A,B,C三个任务要分配给n个宇航员,其中每个宇航员恰好要分配一个任务.设所有n个宇航员的平均年龄为x,只有年龄大于或等于x的宇航员才能分配任务A:只有年龄严格小于x的宇航员才能分配任务B,而 ...

  3. 【UVALive - 3713】Astronauts (2-SAT)

    题意: 有n个宇航员,按照年龄划分,年龄低于平均年龄的是年轻宇航员,而年龄大于等于平均年龄的是老练的宇航员. 现在要分配他们去A,B,C三个空间站,其中A站只有老练的宇航员才能去,而B站是只有年轻的才 ...

随机推荐

  1. gym101673G. A Question of Ingestion (DP)

    题意:有最多100天 每天有一个食物量 你一开始有一个最大胃口表示你最开始能吃多少食物 如果你昨天吃了 那么今天的胃口为昨天的2/3 如果你前天吃了 昨天没吃 那么你的胃口可以恢复到前天的情况 如果你 ...

  2. Leetcode747至少是其他数字两倍的最大数

    Leetcode747至少是其他数字两倍的最大数 在一个给定的数组nums中,总是存在一个最大元素 .查找数组中的最大元素是否至少是数组中每个其他数字的两倍.如果是,则返回最大元素的索引,否则返回-1 ...

  3. IOS上MediaPlayer framework实现视频播放

    播放电影文件: iOS sdk中可以使用MPMoviePlayerController来播放电影文件.但是在iOS设备上播放电影文件有严格的格式要求,只能播放下面两个格式的电影文件. • H.264 ...

  4. LeetCode141LinkedListCycle和142LinkedListCycleII

    141题:判断链表是不是存在环! // 不能使用额外的存储空间 public boolean hasCycle(ListNode head) { // 如果存在环的 两个指针用不一样的速度 会相遇 L ...

  5. 「 Luogu P1850 」 换教室

    解题思路 很明显的是个期望 $dp$. 先前想到 $dp[i][j]$ 表示第决策到第 $i$ 个时间段,已经进行了 $j$ 次申请,然后就没有然后了,因为这根本就没法转移啊,你又不知道前 $i-1$ ...

  6. Re0:DP学习之路 01背包如何打印路径?

    伪代码 用二维数组记录,如果出现可以转移的dp那么记录bk[当前体积][装的物品]=1 输出的时候倒推,如果存在连通的边那么输出并且总共的体积减去输出的体积 代码(uva-624,目前wa不明所以,网 ...

  7. Address already in use: JVM_Bind:8080错误的解决办法

    解决办法:先到命令行查找8080端口号被那个占用,输入后面的命令:netstat -ano 查到 然后到任务管理器把PID为20904的进程给结束掉,就OK了 -------------------- ...

  8. Garden of Eden

    Garden of Eden Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  9. ssh登录问题

    ssh username@ip 密码正确但是登陆ssh时permission denied 1.   启动sshd:/etc/init.d/ssh start 2.   在/etc/ssh/sshd_ ...

  10. 5-14 电话聊天狂人 (25分) HASH

    给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤10​5​​),为通话记录条数.随后NN行,每行给出一条通话记录.简单起见,这里只列出 ...