URAL 2089 Experienced coach Twosat
Description
Input
Output
Sample Input
| input | output |
|---|---|
3 4 |
Yes |
6 4 |
No |
题意:给出n对点a,b 要求从没对点中选出一个,且最终选出的点n个数不能存在相同的。输入数据满足每种数最多出现3次,最少出现1次
思路:第i对点的编号2*i, 2*i+1, 因为每个数最多出现3次,那么完全可以枚举每个数,然后相同的数之间的编号连一条边,表示这两个编号不能同时选,这样跑完twosat就能得到一个满足情况的解或无解。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <cstdlib>
#include <map>
#include <set>
#include <cmath>
using namespace std;
const int N = 2e6 + ;
struct Edge {
int to, nex;
}e[N];
int head[N], tot;
void init() {
tot = ; memset(head, -, sizeof head);
}
void add(int u, int v) {
e[tot].to = v;
e[tot].nex = head[u];
head[u] = tot++;
}
int Low[N], DFN[N], Stack[N], Belong[N];
int Index, top;
int scc;
bool Instack[N];
int num[N]; void Tarjan(int u) {
int v;
Low[u] = DFN[u] = ++Index;
Stack[top++] = u;
Instack[u] = true; for(int i = head[u]; ~i; i = e[i].nex) {
v = e[i].to;
if(!DFN[v]) {
Tarjan(v);
if(Low[u] > Low[v]) Low[u] = Low[v];
}else if(Instack[v] && Low[u] > DFN[v]) Low[u] = DFN[v];
}
if(Low[u] == DFN[u]) {
scc++;
do
{
v = Stack[--top];
Instack[v] = false;
Belong[v] = scc;
num[scc]++;
}while(v != u);
}
}
bool solvable(int n) {
memset(DFN, , sizeof DFN);
memset(Instack, false, sizeof Instack);
memset(num, , sizeof num);
Index = scc = top = ;
for(int i = ; i < n; ++i) if(!DFN[i]) Tarjan(i); for(int i = ; i < n; i += ) {
if(Belong[i] == Belong[i ^ ]) return false;
}
return true;
} queue<int> q1, q2;
vector<vector<int> >dag;
int vis[N];
int indeg[N];
int cf[N];
void solve(int n) {
dag.assign(scc+, vector<int>());
memset(indeg, , sizeof indeg);
memset(vis, , sizeof vis);
for(int u = ; u < n; ++u) {
for(int i = head[u]; ~i; i = e[i].nex) {
int v = e[i].to;
if(Belong[u] != Belong[v]) {
dag[ Belong[v] ].push_back(Belong[u]);
indeg[ Belong[u] ]++;
}
}
}
for(int i = ; i < n; i += ) {
cf[ Belong[i] ] = Belong[i ^ ];
cf[ Belong[i ^ ] ] = Belong[i];
}
while(!q1.empty()) q1.pop();
while(!q2.empty()) q2.pop();
for(int i = ; i <= scc; ++i) if(indeg[i] == ) q1.push(i); while(!q1.empty()) {
int u = q1.front();
q1.pop();
if(vis[u] == ) {
vis[u] = ;
vis[ cf[u] ] = ;
}
int sz = dag[u].size();
for(int i = ; i < sz; ++i) {
indeg[ dag[u][i] ]--;
if(indeg[ dag[u][i] ] == ) q1.push(dag[u][i]);
}
}
}
int r[N];
vector<int> g[N];
int main() {
#ifdef LOCAL
freopen("in", "r", stdin);
#endif
int n, m;
while(~scanf("%d%d", &m, &n)) {
init();
int tot = ; int u, v;
for(int i = ; i < m; ++i) {
scanf("%d%d", &u, &v);
r[tot++] = u;
r[tot++] = v;
g[u].push_back( * i);
g[v].push_back( * i + );
} for(int i = ; i <= n; ++i) {
int sx = g[i].size();
for(int j1 = ; j1 < sx; ++j1) {
for(int j2 = j1 + ; j2 < sx; ++j2) {
int v1 = g[i][j1];
int v2 = g[i][j2];
add(v1, v2 ^ );
add(v2, v1 ^ );
}
}
}
if(solvable( * m)) {
solve( * m);
puts("Yes");
for(int i = ; i < m; ++i) {
if(vis[ Belong[ * i] ]) printf("%d\n", r[ * i + ]);
else printf("%d\n", r[ * i]);
}
}else puts("No");
}
return ;
}
URAL 2089 Experienced coach Twosat的更多相关文章
- 【2-SAT】URAL - 2089 - Experienced coach
题意:给出n对点a,b 要求从没对点中选出一个,且最终选出的点n个数不能存在相同的.输入数据满足每种数最多出现3次,最少出现1次 思路:第i对点的编号2*i, 2*i+1, 因为每个数最多出现3 ...
- Ural2089:Experienced coach(二分图匹配)
Misha trains several ACM teams at the university. He is an experienced coach, and he does not undere ...
- URAL 2078~2089
URAL 2078~2089 A - Bowling game 题目描述:给出保龄球每一局击倒的球数,按照保龄球的规则,算出总得分的最小值和最大值. solution 首先是最小值:每一局第一球击倒\ ...
- URAL 1873. GOV Chronicles
唔 神题一道 大家感受一下 1873. GOV Chronicles Time limit: 0.5 secondMemory limit: 64 MB A chilly autumn night. ...
- 【HDU 2089】不要62
http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp,参照了打野的博客 预处理出f数组,f[i][j]表示第i位为数字j时的可行的数字总数. 对于区间 ...
- 后缀数组 POJ 3974 Palindrome && URAL 1297 Palindrome
题目链接 题意:求给定的字符串的最长回文子串 分析:做法是构造一个新的字符串是原字符串+反转后的原字符串(这样方便求两边回文的后缀的最长前缀),即newS = S + '$' + revS,枚举回文串 ...
- ural 2071. Juice Cocktails
2071. Juice Cocktails Time limit: 1.0 secondMemory limit: 64 MB Once n Denchiks come to the bar and ...
- ural 2073. Log Files
2073. Log Files Time limit: 1.0 secondMemory limit: 64 MB Nikolay has decided to become the best pro ...
- ural 2070. Interesting Numbers
2070. Interesting Numbers Time limit: 2.0 secondMemory limit: 64 MB Nikolay and Asya investigate int ...
随机推荐
- beaglebone black 烧写系统后释放空间。
执行 ./opt/script/toolsgrow_partition.sh就能将2g的空间变为sd卡的大小,我的是8g,执行后就是7.7g
- HTML5 canvas学习笔记(一)
canvas是HTML5中新增的标签,下面是各浏览器的支持程度: canvas的默认大小为:宽-300px,高-150px(注意:画布的大小作为canvas标签的行内样式设置,而且是没有“px”单位的 ...
- C#操作日志
首先引用NLog的dll文件 using System.IO; using NLog; -------------------------------------------------------- ...
- intellij idea Maven 创建项目时出现的一些问题
1.关于maven仓库的问题 在下载资源的时候特别慢,原因是因为天朝的网络你们都懂的.解决方式使用国内镜像,原本可以用的OSChina的镜像,由于其服务器关闭,现在无法使用. 解决方案是使用阿里云的m ...
- Jquery 轮播图简易框架
=====================基本结构===================== <div class="carousel" style="width: ...
- oracle 学习笔记(三)
1. SQL(基础查询) 1.1. 基本查询语句 1.1.1. FROM子句 SQL查询语句的语法如下: SELECT <*, column [alias], -> FROM tabl ...
- c coroutine
今天看了下云风c coroutine 代码 博客,发现 coroutine 实现原理其实还比较简单,就用户态栈切换,只需要几十行汇编,特别轻量级. 具体实现 1. 创建一个coroutine: 也就 ...
- 使用winshark分析三次握手,四次挥手
三次握手 ip 106.120.167.67捕获的数据 数据信息 分析: 从图中可以看出,前三条为三次握手过程,使用TCP协议. 结合图,第一条为建立连接请求,客户端向服务器发送SYN=1的报文, ...
- Android带图片的Toast(自定义Toast)
使用Android默认的Toast Toast简介: Toast是一个简单的消息显示框,能够短暂的出现在屏幕的某个位置,显示提示消息. 默认的位置是屏幕的下方正中,一般Toast的使用如下: Toas ...
- Python之路,Day6 - Python基础6
本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...