一,二分图的定义
首先,二分图是一个图,这个图的特殊点在于这个图的点可以分成两个集合,并且这个图只在
两个集合间有连边,二分图内部没有连边。
二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B)
并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。——百度百科
二,二分图的性质
二分图内部不存在奇环(就是边数为奇数的环),可以作为二分图的判定方法。
三,二分图的判定
一般我们采用染色法,给当前顶点染成一种颜色,给另一个顶点染成不同的颜色,如果某一步时条件冲突
就证明当前不是一个二分图,如果全部染色完成没有冲突就证明是一个二分图。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 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 }