UVa 10004:Bicoloring
这道题要我们判断所给图是否可以用两种颜色进行染色,即"二染色“。已知所给图一定是强连通图。
分析之:
若图中无回路,则该图是一棵树,一定可以二染色。
若图中有回路,但回路有偶数个节点,仍然可以二染色。
仅当图中存在回路且回路有奇数个节点时,不能二染色。
具体实现细节我在代码中给出了详细的注释,我的解题代码如下:
/*
关键在于:当且仅当存在奇回路时,无法二染色
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <algorithm>
using namespace std; int adj[200][200]; //邻接矩阵
int set[200]; //标记图中点所在集合序号
int vis[200]; //标记find中是否已搜索过该点
int n,l; int find(int sour, int obj)
{//在图上从点sour出发搜索obj,如果两者距离为偶返回0,为奇返回1
vis[sour]=1;
if(sour==obj) return 0;
for(int i=0; i<n; i++)
if(adj[i][sour] && !vis[i]) return 1-find(i,obj);
} int main()
{ int ta,tb;
while(cin >> n && n!=0)
{
cin >> l;
memset(adj,0,sizeof(adj));
memset(set,0,sizeof(set));
int ok=1;
for(int i=0; i<l; i++)
{
cin >> ta >> tb;
if(ok)
{
if(set[ta] && set[tb]) //输入的相邻两点原先就在某个集合中
{
if(set[ta]==set[tb]) //输入的相邻两点所在集合相同,则用find搜索
{
memset(vis,0,sizeof(vis));
if(!find(ta,tb)) { ok=0;} //若返回0,则ta,tb两点将构成奇数个节点的回路,无法二染色
}
else
{
for(int j=0; j<n; j++) if(set[j]==set[tb]) //输入的相邻两点所在集合不同,且并未产生偶节点数的回路,则将其中一集合的序号全部改为与另一集合相同
set[tb]=set[ta];
}
}
else if(!set[ta] && !set[tb]) //输入的两点原先均未标记所在集合,则标记之
{
set[ta]=set[tb]=ta+1; //没有使用=ta是因为如果那样,ta=0时set[ta],set[tb]将不产生变化
}
else if(!set[ta]) //只有ta未标记,则用tb标记ta
{
set[ta]=set[tb];
}
else if(!set[tb]) //同上
{
set[tb]=set[ta];
}
adj[ta][tb]=adj[tb][ta]=1;
}
}
if(ok) cout << "BICOLORABLE.\n";
else cout << "NOT BICOLORABLE.\n";
}
return 0;
}
UVa 10004:Bicoloring的更多相关文章
- UVA 10004 Bicoloring
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=12&pa ...
- UVA - 10004 Bicoloring(判断二分图——交叉染色法 / 带权并查集)
d.给定一个图,判断是不是二分图. s.可以交叉染色,就是二分图:否则,不是. 另外,此题中的图是强连通图,即任意两点可达,从而dfs方法从一个点出发就能遍历整个图了. 如果不能保证从一个点出发可以遍 ...
- UVA 10004 Bicoloring(DFS染色)
题意: 给N个点构成的无环无向图,并且保证所有点对都是连通的. 给每个点染色,要么染成黑要么染成白.问是否存在染色方案使得所有有边相连的点对颜色一定不一样. 是输出 BICOLORABLE 否则输出 ...
- uva 10004 Bicoloring(dfs二分染色,和hdu 4751代码差不多)
Description In the ``Four Color Map Theorem" was proven with the assistance of a computer. This ...
- Bicoloring UVA - 10004 二分图判断
\(\color{#0066ff}{题目描述}\) 多组数据,n=0结束,每次一个n,m,之后是边,问你是不是二分图 \(\color{#0066ff}{输入样例}\) 3 3 0 1 1 2 2 0 ...
- UVA 12950 : Even Obsession(最短路Dijkstra)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 10480:Sabotage (最小割集)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 156:Ananagrams (vector+map+sort)
题意:一大堆单词中间有空格隔开,以'#'结束输出,问只出现一次的的单词有哪些(如果两个具有相同的长度,相同的字母也算是相同的,不区分大小写,如:noel和lone属于一个单词出现两次).最后按照字典序 ...
- UVA 10815:Andy's First Dictionary(STL)
题意:给出一段英文,里面包含一些单词,空格和标点,单词不区分大小写,默认都为小写.按照字典序输出这些单词(这些单词不能有重复,字母全部变成小写) stringstream:包含在头文件#include ...
随机推荐
- UIView的clipsToBounds属性,layoutSubViews及触摸事件传递(默认情况下)总结
一.UIView的clipsToBounds属性 * 默认情况下,超出父控件尺寸范围的子控件还是可见的 * 如果设置父控件的clipsToBounds=YES,就会裁剪掉超出父控件尺寸范围内的子控件, ...
- CodeIgniter 3之Session类库(2)(转)
CI3的Session的重大改变就是默认使用了原生的Session,这符合Session类库本来的意思,似乎更加合理一些.总体来说,虽然设计理念不同,但为了保证向后兼容性,类库的使用方法与CI2.0的 ...
- ecshop 调用指定分类的推荐,热卖,新品
未测试 1.includes/lib_goods.php文件.把SQL语句改一下,与category表关联即可 将 $sql = 'SELECT g.goods_id,g.goods_name, g. ...
- Hibernate-Native SQL
1.标量(值)查询: sess.createSQLQuery("SELECT * FROM CATS").list(); sess.createSQLQuery("SEL ...
- Android下EditText的hint的一种显示效果------FloatLabelLayout
效果: 此为EditText的一种细节,平时可能用的不多,但是用户体验蛮好的,特别是当注册页面的项目很多的时候,加上这种效果,体验更好 仅以此记录,仅供学习参考. 参考地址:https://gist. ...
- Android 注解的一些应用以及原理
在这边文章之前你首先需要对java 的注解部分有一个基本的了解(不需要太过的深入). 简单来说,注解这个东西就是用于辅助我们开发java代码的,注解本身无法干扰java源代码的执行. 在android ...
- jQuery autoComplete 样式
前提:使用了jQuery-ui 官网:http://jqueryui.com/autocomplete/ /*** autocomplete ***/ .ui-widget-content { bac ...
- jquery ajax jsonp跨域调用实例代码
今天研究了AJAX使用JSONP进行跨域调用的方法,发现使用GET方式和POST方式都可以进行跨域调用,这里简单分享下,方便需要的朋友 客户端代码 复制代码 代码如下: <%@ Page Lan ...
- SSD Cloud Hosting - Linode的配置和部署,搭建Java环境
0.发牢骚 前一个月在淘宝购买了个Jsp空间,挺便宜的,才38元/年.部署了程序,然后ALIMAMA验证网站,一直提示验证失败.最后找卖家,他说可能是因为空间太慢,照他的推荐换了最好的空间,138元/ ...
- SQL查询数据库信息, 数据库表名, 数据库表信息
SQL查询数据库信息, 数据库表名, 数据库表信息 ---------------------------------------------- -- 以下例子, 在sql_server 中可以直接运 ...