您的位置:首页 > 其它

二分图判定

2014-07-18 17:32 309 查看
二分图定义:

       设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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息