二分图判定
2014-07-18 17:32
309 查看
二分图定义:
设G=(V,E)是一个无向图。如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集。则称图G为二分图。也就是说在二分图中,顶点可以分为两个集合X和Y,每一条边的两个顶点都分别位于X和Y集合中。
DFS
BFS
设G=(V,E)是一个无向图。如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集。则称图G为二分图。也就是说在二分图中,顶点可以分为两个集合X和Y,每一条边的两个顶点都分别位于X和Y集合中。
DFS
/** **author :Skylon ** ╭︿︿︿╮ {/ A C /} ( (OO) ) ︶︶︶ ** ** **NYOJ_1015题** ** 2014 年 7月 18日** **/ #include <cmath> #include <queue> #include <stack> #include <vector> #include <cstdio> #include <string> #include <cctype> #include <climits> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; int n,m,ans; int map[220][220],color[220],vis[220]; bool flag; void dfs(int u) { for (int v=0;v<n;v++) { if (map[u][v]==1) { if (vis[v]==0) { vis[v]=1; color[v]=!color[u]; dfs(v); } else if (color[u]==color[v]) { flag=false; return ; } } } } int main() { while (~scanf("%d%d",&n,&m)) { memset(map,0,sizeof(map)); for (int i=0;i<220;i++) color[i]=vis[i]=0; for (int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); map[a][b]=map[b][a]=1; } color[0]=vis[0]=1; flag=true; dfs(0); if (!flag) printf("NOT BICOLORABLE.\n"); else printf("BICOLORABLE.\n"); } return 0; }
BFS
/** **author :Skylon ** ╭︿︿︿╮ {/ A C /} ( (oo) ) ︶︶︶ ** ** **NYOJ_1015题** ** 2014 年 月 日** **/ #include <cmath> #include <queue> #include <stack> #include <vector> #include <cstdio> #include <string> #include <cctype> #include <climits> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #define CLR(arr,val) memset(arr,val,sizeof(arr)) using namespace std; const int N=205; int color ,n,m; bool vis ; vector<int> map ; bool bfs(int s) { queue<int> q; q.push(s);color[s]=1; while(!q.empty()) { int now=q.front(); q.pop(); if(!vis[now]) { int len=map[now].size(); for(int i=0;i<len;i++) { int des=map[now][i]; q.push(des); if(color[des]==-1) color[des]=color[now]==0?1:0; else { if(color[des]==color[now]) return false; else continue; } } vis[now]=true; } } return true; } int main() { while(~scanf("%d%d",&n,&m)) { CLR(color,-1);CLR(vis,0); CLR(map,0); for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); map[a].push_back(b); map[b].push_back(a); } bool flag=bfs(0); if(!flag) { printf("NOT BICOLORABLE.\n\n"); } else printf("BICOLORABLE.\n"); } return 0; }
相关文章推荐
- hiho 32 二分图判定一
- HDU4865 Prince and Princess 强连通分量+二分图判定
- Catch----二分图的判定与奇环的判定
- 二分图的判定
- 二分图判定 DFS版
- UVA 1627 【二分图判定+背包问题】
- 二分图的判定
- 二分图一•二分图判定+异或运算
- HDU 4751 Divide Groups 【判定二分图】
- hdu 5285 wyh2000 and pupil(二分图的判定)
- hdu 2444 二分图判定+求二分图最大匹配
- hdu 2444判定二分图+最大匹配
- 099_二分图判定
- POJ 2942 圆桌骑士 点双连通+二分图判定
- UVa 10004 Bicoloring(二分图判定+DFS)
- HDU 2444 The Accomodation of Students 二分图判定+最大匹配
- 图论入门———深度优先搜索实现二分图判定(dfs染色)
- C-Cleaning Pipes(判断两线段相交+二分图判定) 2015-2016 Northwestern European Regional Contest (NWERC 2015)
- hihocoder 第三十三周 二分图一•二分图判定
- UVA11396-Claw Decomposition(二分图判定)