hdu4751Divide Groups(dfs枚举完全图集合或者bfs染色)
/*************************************************************************
> File Name: j.cpp
> Author: HJZ
> Mail: 2570230521@qq.com
> Created Time: 2014年08月28日 星期四 12时26分13秒
************************************************************************/ //提議:能否將一個給定的有向圖,變成兩個完全圖(任意兩點都直接相連,雙向邊) #include <queue>
#include <string>
#include <cstdio>
#include <stack>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 105
using namespace std; int a[N], b[N];
//a, b集合初始化爲空!
int g[N][N];
int n; bool flag; bool dfs(int u, int la, int lb){
if(u>n && la+lb==n) return true;//如果a ,b集合中的元素數目恰好是n,則說明可以形成兩個完全圖!
bool flagx=true;
for(int i=; i<la && flagx; ++i)
if(!(g[a[i]][u] && g[u][a[i]]))
flagx=false;
if(flagx) a[la]=u;//如果u節點可以放入a集合中
if(flagx && dfs(u+, la+, lb)) return true;
bool flagy=true;
for(int i=; i<lb && flagy; ++i)
if(!(g[b[i]][u] && g[u][b[i]]))
flagy=false;
if(flagy) b[lb]=u;//如果u節點可以放入b集合中
if(flagy && dfs(u+, la, lb+)) return true;
return false;
} int main(){
while(scanf("%d", &n)!=EOF){
memset(g, , sizeof(g));
for(int i=; i<=n; ++i){
int v;
vis[i]=;
while(scanf("%d", &v) && v)
g[i][v]=;
}
flag=dfs(, , );
if(flag)
printf("YES\n");
else printf("NO\n");
}
return ;
}
/*************************************************************************
> File Name: j.cpp
> Author: HJZ
> Mail: 2570230521@qq.com
> Created Time: 2014年08月28日 星期四 12时26分13秒
************************************************************************/
//思路:bfs,和判断二分图差不多,将图分成两个集合,如果a和b都有g[a][b]&&g[b][a]说明
//a和b一定在同一个集合中,如果有a,b不在一个集合中,a,c不在同一个集合中,b,c也不在同一个
//集合中,出现矛盾!也就是这个图不能分成两个完全图!
#include <queue>
#include <string>
#include <cstdio>
#include <stack>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 105
using namespace std;
queue<int>q;
int g[N][N];
int coll[N];
int n; bool bfs(int u){
while(!q.empty()) q.pop();
q.push(u);
while(!q.empty()){
int x=q.front();
q.pop();
for(int y=; y<=n; ++y){
if(x==y || g[x][y]&&g[y][x]) continue;
if(coll[y]==-){
coll[y]=coll[x]^;
q.push(y);
}
else if(coll[y]==coll[x])
return true;
}
}
return false;
} int main(){
while(scanf("%d", &n)!=EOF){
memset(g, , sizeof(g));
for(int i=; i<=n; ++i){
int v;
while(scanf("%d", &v) && v)
g[i][v]=;
coll[i]=-;
}
int i;
for(i=; i<=n; ++i){
if(coll[i]==-){
coll[i]=;//默认是在集合0中
if(bfs(i)) break;
}
}
if(i<=n) printf("NO\n");
else printf("YES\n");
}
return ;
}
hdu4751Divide Groups(dfs枚举完全图集合或者bfs染色)的更多相关文章
- poj 1753 Flip Game(bfs状态压缩 或 dfs枚举)
Description Flip game squares. One side of each piece is white and the other one is black and each p ...
- POJ1288 Sly Number(高斯消元 dfs枚举)
由于解集只为{0, 1, 2}故消元后需dfs枚举求解 #include<cstdio> #include<iostream> #include<cstdlib> ...
- POJ 2429 GCD & LCM Inverse (Pollard rho整数分解+dfs枚举)
题意:给出a和b的gcd和lcm,让你求a和b.按升序输出a和b.若有多组满足条件的a和b,那么输出a+b最小的.思路:lcm=a*b/gcd lcm/gcd=a/gcd*b/gcd 可知a/gc ...
- POJ 1270 Following Orders (拓扑排序,dfs枚举)
题意:每组数据给出两行,第一行给出变量,第二行给出约束关系,每个约束包含两个变量x,y,表示x<y. 要求:当x<y时,x排在y前面.让你输出所有满足该约束的有序集. 思路:用拓扑排 ...
- HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)
想到枚举m个点,然后求最小生成树,ratio即为最小生成树的边权/总的点权.但是怎么枚举这m个点,实在不会.网上查了一下大牛们的解法,用dfs枚举,没想到dfs还有这么个作用. 参考链接:http:/ ...
- POJ 1753 Flip Game (DFS + 枚举)
题目:http://poj.org/problem?id=1753 这个题在開始接触的训练计划的时候做过,当时用的是DFS遍历,其机制就是把每一个棋子翻一遍.然后顺利的过了.所以也就没有深究. 省赛前 ...
- Day054--MySQL, 创建用户和授权, 数据类型, 枚举和集合, 约束,唯一, 主键,外键
创建用户和授权 1.创建用户: # 指定ip:192.118.1.1的mjj用户登录 create user 'mjj'@'192.118.1.1' identified by '123'; # 指定 ...
- 数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)
邻接矩阵存图 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Las ...
- HDU1045 Fire Net(DFS枚举||二分图匹配) 2016-07-24 13:23 99人阅读 评论(0) 收藏
Fire Net Problem Description Suppose that we have a square city with straight streets. A map of a ci ...
随机推荐
- Hbase随笔
大数据时代的数据量是超大规模的,传统的关系数据库已经很难存储和管理这些数据了,为了存储海量数据,我们有了HDFS,它可以把成千上万台服务器上的硬盘聚集成一块超级大的硬盘,为了让这些数据产生价值,我们有 ...
- code review作业
下面是对结对编程队友12061166 宋天舒的code review 五个优点: 1.代码的风格优秀,注释不多,但是必要的注释还是有的,比如: // 三种模式 // mode1仅统计单个单词 // m ...
- windows编程:第一个windows程序
#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h> #include <math ...
- day13---堡垒机
1.业务需求 兼顾业务安全目标与用户体验,堡垒机部署后,不应使用户访问业务系统的访问变的复杂,否则工作将很难推进,因为没人喜欢改变现状,尤其是改变后生活变得更艰难 保证堡垒机稳定安全运行, 没有100 ...
- Mac OS X 安装Win7双系统
Mac10安装双系统 为了有一个纯净的开发环境,就在mac电脑中安装windows虚拟机.刚开始使用还很顺利,两个系统的交互很方便,mac用来下载.搜索和写笔记:windows纯开发.时间长了以后关机 ...
- IO-04. 混合类型数据格式化输入(5)
本题要求编写程序,顺序读入浮点数1.整数.字符.浮点数2,再按照字符.整数.浮点数1.浮点数2的顺序输出. 输入格式: 输入在一行中顺序给出浮点数1.整数.字符.浮点数2,其间以1个空格分隔. 输出格 ...
- Zookeeper初次使用
下面介绍Linux系统中Zookeeper的初次使用方法. 1.jdk安装和zookeeper下载 首先从jdk官网中下载jdk文件,然后将文件放在/usr/local/java目录下解压,并打开.b ...
- Git凭证存储(简单易懂,一学就会,认真看)
今天给自己提了一个问题,当我们在github.com或者gitlab上面新建仓库,并克隆到本地,首次使用的时候,会被问及用户名密码,但是这两个信息存在哪里呢? 带着这个问题,我开始搜索,并在<P ...
- 软件开发常用快捷键 & 命令总结
HTML + JavaScript + CSS 1. 在web开发经常会遇到如: 这样的字符.它其实是Html将一些特殊字符(Html语法字符)的一种表达方式. 下面列举几个常用字符: 空 ...
- 《Linux内核设计与实现》读书笔记 - 目录 (完结)
读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!!!). 为了方便以后查看, 做个<Linux内核设计与实现>读书笔记 的目录: < ...