hdu4751Divide Groups(dfs枚举完全图集合或者bfs染色)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介:
 1 /*************************************************************************
 2     > File Name: j.cpp
 3     > Author: HJZ
 4     > Mail: 2570230521@qq.com 
 5     > Created Time: 2014年08月28日 星期四 12时26分13秒
 6  ************************************************************************/
 7 
 8 //提議:能否將一個給定的有向圖,變成兩個完全圖(任意兩點都直接相連,雙向邊)
 9 
10 #include <queue>
11 #include <string>
12 #include <cstdio>
13 #include <stack>
14 #include <cstring>
15 #include <iostream>
16 #include <algorithm>
17 #define N 105
18 using namespace std;
19 
20 int a[N], b[N];
21 //a, b集合初始化爲空!
22 int g[N][N];
23 int n;
24 
25 bool flag;
26 
27 bool dfs(int u, int la, int lb){
28    if(u>n && la+lb==n) return true;//如果a ,b集合中的元素數目恰好是n,則說明可以形成兩個完全圖!
29    bool flagx=true;
30    for(int i=0; i<la && flagx; ++i)
31        if(!(g[a[i]][u] && g[u][a[i]]))
32            flagx=false;
33    if(flagx) a[la]=u;//如果u節點可以放入a集合中
34    if(flagx && dfs(u+1, la+1, lb)) return true;
35    bool flagy=true;
36    for(int i=0; i<lb && flagy; ++i)
37        if(!(g[b[i]][u] && g[u][b[i]]))
38             flagy=false;
39    if(flagy) b[lb]=u;//如果u節點可以放入b集合中
40    if(flagy && dfs(u+1, la, lb+1)) return true;
41    return false;
42 }
43 
44 int main(){
45    while(scanf("%d", &n)!=EOF){
46       memset(g, 0, sizeof(g));
47       for(int i=1; i<=n; ++i){
48          int v;
49          vis[i]=0;
50          while(scanf("%d", &v) && v)
51            g[i][v]=1;
52       }
53      flag=dfs(1, 0, 0);
54      if(flag)
55          printf("YES\n");
56      else printf("NO\n");
57    }
58    return 0;
59 }

复制代码
 1 /*************************************************************************
 2     > File Name: j.cpp
 3     > Author: HJZ
 4     > Mail: 2570230521@qq.com 
 5     > Created Time: 2014年08月28日 星期四 12时26分13秒
 6  ************************************************************************/
 7 //思路:bfs,和判断二分图差不多,将图分成两个集合,如果a和b都有g[a][b]&&g[b][a]说明
 8 //a和b一定在同一个集合中,如果有a,b不在一个集合中,a,c不在同一个集合中,b,c也不在同一个
 9 //集合中,出现矛盾!也就是这个图不能分成两个完全图!
10 #include <queue>
11 #include <string>
12 #include <cstdio>
13 #include <stack>
14 #include <cstring>
15 #include <iostream>
16 #include <algorithm>
17 #define N 105
18 using namespace std;
19 queue<int>q;
20 int g[N][N];
21 int coll[N];
22 int n;
23 
24 bool bfs(int u){
25     while(!q.empty())  q.pop();
26     q.push(u);
27     while(!q.empty()){
28         int x=q.front();
29         q.pop();
30         for(int y=1; y<=n; ++y){
31            if(x==y || g[x][y]&&g[y][x]) continue;
32            if(coll[y]==-1){
33                 coll[y]=coll[x]^1;
34                 q.push(y);
35            }
36            else if(coll[y]==coll[x])
37                 return true;
38         }
39     }
40     return false;
41 }
42 
43 int main(){
44    while(scanf("%d", &n)!=EOF){
45        memset(g, 0, sizeof(g));
46        for(int i=1; i<=n; ++i){
47             int v;
48             while(scanf("%d", &v) && v)
49                 g[i][v]=1;
50             coll[i]=-1;
51        }
52        int i;
53        for(i=1; i<=n; ++i){
54            if(coll[i]==-1){
55                coll[i]=0;//默认是在集合0中
56                if(bfs(i)) break;
57            }
58        }
59        if(i<=n) printf("NO\n");
60        else printf("YES\n");
61    }
62    return 0;
63 }









本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/3942077.html,如需转载请自行联系原作者
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
5月前
|
人工智能 算法 Java
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。
|
Java
hdu1016 Prime Ring Problem【素数环问题(经典dfs)】
hdu1016 Prime Ring Problem【素数环问题(经典dfs)】
47 0
|
人工智能
CF1315 C.Restoring Permutation(构造 二分 贪心)
CF1315 C.Restoring Permutation(构造 二分 贪心)
68 0
SWERC 2020 C. Safe Distance (二分 并查集)
SWERC 2020 C. Safe Distance (二分 并查集)
108 0
UPC Graph (最小生成树 || 并查集+二分)
UPC Graph (最小生成树 || 并查集+二分)
92 0
Biggest Number深搜
You can start from any square, walk in the maze, and finally stop at some square. Each step, you may only walk into one of the four neighbouring squares (up, down, left, right) and you cannot walk into obstacles or walk into a square more than once.
114 0
Biggest Number深搜
HDU-1598,find the most comfortable road(并查集+枚举)
HDU-1598,find the most comfortable road(并查集+枚举)