hdu 5971 Wrestling Match 判断能否构成二分图
http://acm.hdu.edu.cn/showproblem.php?pid=5971
Wrestling Match
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 25 Accepted Submission(s): 15
1 3
1 4
3 5
4 5
5 4 1 0
1 3
1 4
3 5
4 5
2
YES
给定一个图,有可能是分散的图,其中有一些点是固定是颜色的,现在要求判断其能否成为二分图。
假如是分成了若干个联通快(块内的点个数 >= 2),对于每个联通快,如果有一些点是确定了的,那么就应该选那个点进行开始染色,途中如果遇到一些点已经确定颜色的了,但是和现在的想填的颜色不同,那么就应该输出NO,否则,进行染色即可。
对于点数为1的联通快,如果它没有被确定颜色的话,那么就直接输出NO了。
然后边数要开两倍,不然直接给wa,这里坑了我。一直做不出。
- 5 3 0 0
- 1 2
- 1 3
- 4 5
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- #define IOS ios::sync_with_stdio(false)
- using namespace std;
- #define inf (0x3f3f3f3f)
- typedef long long int LL;
- #include <iostream>
- #include <sstream>
- #include <vector>
- #include <set>
- #include <map>
- #include <queue>
- #include <string>
- int n, m, x, y;
- const int maxn = + ;
- struct node {
- int u, v, w;
- int tonext;
- } e[ * + ];
- int first[maxn];
- bool vis[maxn];
- int black = ;
- int white = ;
- int arr[maxn];
- int ca[maxn];
- bool in[maxn];
- bool flag;
- int num;
- void add(int u, int v, int w) {
- ++num;
- e[num].u = u;
- e[num].v = v;
- e[num].w = w;
- e[num].tonext = first[u];
- first[u] = num;
- }
- void dfs(int cur, int col) {
- for (int i = first[cur]; i && flag; i = e[i].tonext) {
- int v = e[i].v;
- if (vis[v]) {
- if (arr[v] == col) {
- flag = false;
- return;
- }
- }
- if (vis[v]) continue;
- vis[v] = true;
- if (arr[v] == -) {
- arr[v] = !col;
- dfs(v, !col);
- } else {
- if (arr[v] == col) {
- flag = false;
- return;
- } else {
- dfs(v, !col);
- }
- }
- }
- }
- void work() {
- num = ;
- memset(arr, -, sizeof arr);
- memset(ca, -, sizeof ca);
- memset(in, , sizeof in);
- memset(first, , sizeof first);
- flag = true;
- for (int i = ; i <= m; ++i) {
- int u, v;
- cin >> u >> v;
- add(u, v, );
- add(v, u, );
- in[v] = in[u] = ;
- }
- for (int i = ; i <= x; ++i) {
- int val;
- cin >> val;
- ca[val] = black;
- arr[val] = black;
- }
- for (int i = ; i <= y; ++i) {
- int val;
- cin >> val;
- ca[val] = white;
- arr[val] = white;
- }
- for (int i = ; i <= n; ++i) {
- if (in[i] == && ca[i] == -) {
- cout << "NO" << endl;
- return;
- }
- }
- memset(vis, , sizeof vis);
- for (int i = ; i <= n; ++i) {
- if (vis[i]) continue;
- if (ca[i] == -) continue;
- vis[i] = ;
- arr[i] = ca[i];
- dfs(i, ca[i]);
- }
- for (int i = ; i <= n; ++i) {
- if (vis[i]) continue;
- arr[i] = black;
- dfs(i, black);
- }
- if (flag == false) {
- cout << "NO" << endl;
- return;
- }
- cout << "YES" << endl;
- }
- int main() {
- #ifdef local
- freopen("data.txt","r",stdin);
- #endif
- IOS;
- while (cin >> n >> m >> x >> y) {
- work();
- }
- return ;
- }
hdu 5971 Wrestling Match 判断能否构成二分图的更多相关文章
- hdu 5971 Wrestling Match
题目链接: hdu 5971 Wrestling Match 题意:N个选手,M场比赛,已知x个好人,y个坏人,问能否将选手划分成好人和坏人两个阵营,保证每场比赛必有一个好人和一个坏人参加. 题解:d ...
- HDU 5971 Wrestling Match (二分图)
题意:给定n个人的两两比赛,每个人要么是good 要么是bad,现在问你能不能唯一确定并且是合理的. 析:其实就是一个二分图染色,如果产生矛盾了就是不能,否则就是可以的. 代码如下: #pragma ...
- hdu 5971 Wrestling Match 二分图染色
题目链接 题意 \(n\)人进行\(m\)场比赛,给定\(m\)场比赛的双方编号:再给定已知的为\(good\ player\)的\(x\)个人的编号,已知的为\(bad\ player\)的\(y\ ...
- HDU 5971"Wrestling Match"(二分图染色)
传送门 •题意 给出 n 个人,m 场比赛: 这 m 场比赛,每一场比赛中的对决的两人,一个属于 "good player" 另一个属于 "bad player" ...
- A - Wrestling Match HDU - 5971
Nowadays, at least one wrestling match is held every year in our country. There are a lot of people ...
- Wrestling Match---hdu5971(2016CCPC大连 染色法判断是否是二分图)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5971 题意:有n个人,编号为1-n, 已知X个人是good,Y个人是bad,m场比赛,每场比赛都有一个 ...
- hdu 2444 The Accomodation of Students(最大匹配 + 二分图判断)
http://acm.hdu.edu.cn/showproblem.php?pid=2444 The Accomodation of Students Time Limit:1000MS Me ...
- HDU 3081 Marriage Match II (二分图,并查集)
HDU 3081 Marriage Match II (二分图,并查集) Description Presumably, you all have known the question of stab ...
- hdu 2444(染色法判断二分图+最大匹配)
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
随机推荐
- PYTHON 爬虫笔记二:Urllib库基本使用
知识点一:urllib的详解及基本使用方法 一.基本介绍 urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的 ...
- c/c++通用内存泄漏检测框架GMFD(General Memory Fault Detection Framework)
http://qa.baidu.com/blog/?p=171 1 背景: x86平台有完善的用户态检测内存工具比如valgrind等,可以监控程序运行中详细的内存信息,从而精确定位内存问题.然而随着 ...
- codeforces B. Eugeny and Play List 解题报告
题目链接:http://codeforces.com/problemset/problem/302/B 题目意思:给出两个整数n和m,接下来n行给出n首歌分别的奏唱时间和听的次数,紧跟着给出m个时刻, ...
- 使用Dubbo实现RPC调用
启动Dubbo服务有2个方式,1是通过xml配置,2是通过注解来实现,这点和Spring相似. 采用XML配置如下: <?xml version="1.0" encoding ...
- 数学题--On Sum of Fractions
题目链接 题目意思: 定义v(n)是不超过n的最大素数, u(n)是大于n的最小素数. 以分数形式"p/q"输出 sigma(i = 2 to n) (1 / (v(i)*u(i) ...
- Material Design 之 定义状态栏(Status Bar)的颜色
Hey,好久不见.今天遇到一个问题,想要把Status Bar 和 Tool Bar的颜色弄成一样的,或者是类似的,例如Material Design: 图中Status Bar颜色比Tool Bar ...
- vuex 命名空间
默认情况下,模块内部的action mutation getter是注册在全局命名空间的,如果希望你的模块具有更高的封装度和复用性,你可以通过添加namespaced:true的方式使其成为带命名空间 ...
- NHibernate错误:Could not compile the mapping document的解决
用动软代码生成器的NHibernate生成模板,生成一个“XML映射模板”,老是提示Could not compile the mapping document的问题. 各种的找,就是没找到问题. 后 ...
- bzoj4521
数位dp 复习数位dp 数位dp一般用记忆化搜索来解决 观察需要满足的条件,然后计入状态 状态还要记录是否达到上线,以及前导零 比如说这道题 dfs(bit,a4,a8,cnt,last,limit) ...
- 使用json-lib的JSONObject.toBean( )时碰到的日期属性转换的问题
今天碰到这样一个问题:当前台以JSON格式向后台传递数据的时候,对于数据中的日期属性,无法正常转换为相应的Date属性.JSON数据是这样的:{"birthday":"1 ...