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 ...
随机推荐
- DataGrid控件使用
应用Binding显示后台数据 <UserControl x:Class="demo03.View.UserInfoList" xmlns=" ...
- Unhandled Exception:System.DllNotFoundException: Unable to load DLL"**":找不到指定的模块
在项目中使用C#代码调用C++ DLL时.常常会出现这个问题:在开发者自己的电脑上运行没有问题,但是部署到客户电脑上时会出现下面问题: Unhandled Exception:System.DllNo ...
- vs里根据json快速创建对应类的方法
有时候,我们在调用别人接口的时候,服务端返回了一个json格式的字符串,我们要获取json里面的数据的话一般有两种方式: 1.通过正则 2.反序列化成一个对象 第一种方式这里不再多说,主要说一下第二种 ...
- 使用Java的Frame类编写的QQ登录界面
public static void main(String[] args) { Frame f = new Frame(); //关闭窗体 f.addWindowListener(new Windo ...
- css3-columns多列布局
/*css3中的布局*/ .wrapper{ margin:auto; width:300px; height:200px; border:2px dotted blue; -webkit-colum ...
- IDEA 配置 tomcat的数据源
1.F4打开module setting面板,找到facets 配置项,这个配置项非常重要,里面可配置tomcat加载的web.xml和context.xml文件所在的路径,部署的时候IDEA会自动读 ...
- UIPickerView去掉背景上的黑线
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger) ...
- nginx 反向代理 公用一个外网端口
服务器:ubuntu 配置nginx代理有2个文件,分别是sites-enabled 和sites-available. 路径都在/etc/nginx下,sites-enabled为sites-ava ...
- monkey工具使用中遇到的问题之二:尝试了各种方法通过adb都无法找到设备
测试环境: 1.用的是adt-bundle-windows-x86_64-20140702里面的adb 2.用的是手机模拟器(夜神) 问题描述: 已搭建好adb的环境,输入adb,可以看到以下相关信息 ...
- qt 定时器
重写方法 virtual void timerEvent(QTimerEvent *event); 启动定时器 timerId = startTimer(500);