二分图判定

一,二分图的定义

首先,二分图是一个图,这个图的特殊点在于这个图的点可以分成两个集合,并且这个图只在

两个集合间有连边,二分图内部没有连边。

二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B)

并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。——百度百科

二分图判定_第1张图片

二,二分图的性质

二分图内部不存在奇环(就是边数为奇数的环),可以作为二分图的判定方法。

 

三,二分图的判定

一般我们采用染色法,给当前顶点染成一种颜色,给另一个顶点染成不同的颜色,如果某一步时条件冲突

就证明当前不是一个二分图,如果全部染色完成没有冲突就证明是一个二分图。

 1 #include
 2 #include
 3 #include
 4 #include
 5 
 6 using namespace std;
 7 
 8 struct node
 9 {
10     int ed,nxt;
11 };
12 node edge[2333];
13 int n,m,first[2333],cnt;
14 int color[2333];
15 bool flag;
16 
17 inline void add_edge(int s,int e)
18 {
19     cnt++;
20     edge[cnt].ed=e;
21     edge[cnt].nxt=first[s];
22     first[s]=cnt;
23     return;
24 }
25 
26 inline void pd(int pos,int c)
27 {
28     color[pos]=c;
29     for(int i=first[pos];i;i=edge[i].nxt)
30     {
31         int e=edge[i].ed;
32         if(color[pos]==color[e]) {flag=false;return;}
33         else if(color[e]==0) pd(e,-c);
34     } 
35 }
36 
37 int main()
38 {
39     scanf("%d%d",&n,&m);
40     for(int i=1;i<=m;i++)
41     {
42         int s,e;
43         scanf("%d%d",&s,&e);
44         add_edge(s,e);
45         add_edge(e,s);
46     }
47     flag=true;
48     memset(color,0,sizeof(color));
49     for(int i=1;i<=n;i++)
50     {
51         if(!color[i]) pd(i,1);
52         if(!flag)
53         {
54             printf("NO");
55             return 0;
56         }
57     }
58     printf("YES");
59     return 0;
60 }

 

转载于:https://www.cnblogs.com/Hoyoak/p/11409293.html

你可能感兴趣的:(二分图判定)