二分图判定
2015-03-07 20:24
204 查看
题意:给定顶点数和边数的无向图,判定其是否为二分图。
思路:首先需要知道一个图是二分图并不代表其实联通的,那么遍历每个顶点,对其进行染色,并处理与之相邻的顶点,若无色,则染成与之相反的颜色,若有,则判断是否同色,若同色则不是二分图。所有顶点成功染色即为二分图。
思路:首先需要知道一个图是二分图并不代表其实联通的,那么遍历每个顶点,对其进行染色,并处理与之相邻的顶点,若无色,则染成与之相反的颜色,若有,则判断是否同色,若同色则不是二分图。所有顶点成功染色即为二分图。
#include <stdio.h> #include <string.h> int c[10010]; struct EDGE{ int to; struct EDGE* next; }e[80010];//必须开到边数的2倍 int size; struct EDGE *p[10010]; int ok; void adde(int u,int v) { e[size].to=v; e[size].next=p[u]; p[u]=&e[size]; size++; } void solve(int k) { if(!ok) return ; struct EDGE* u; for(u=p[k];u!=NULL&&ok;u=u->next){ int t=u->to; if(c[t]==-1) {c[t]=!c[k];solve(t);} else if(c[t]==c[k]) {ok=0;return ;} } } int main() { int T; scanf("%d",&T); while(T--){ int n,m,i; scanf("%d%d",&n,&m); memset(c,-1,sizeof(c)); memset(p,NULL,sizeof(p)); size=0;ok=1; for(i=0;i<m;i++){ int u,v; scanf("%d%d",&u,&v); if(u==v) ok=0; adde(u,v); adde(v,u); } for(i=n;i>0&&ok;i--) if(c[i]==-1){ c[i]=0; solve(i); } printf("%s\n",ok?"Correct":"Wrong"); } return 0; }
相关文章推荐
- uva 11396 - Claw Decomposition(二分图判定)
- hihoCoder#1121(二分图判定)
- POJ 1112 Team Them Up! 二分图判定+01背包
- 二分图判定 (挑战程序设计竞赛)
- UVa10004 Bicoloring(二分图判定)
- hdu4751(二分图判定)
- hdu 4751 Divide Groups (2-SAT or 补图+二分图判定)
- 二分图一?二分图判定(不连通的)
- HihoCoder - 1121 二分图判定
- 二分图一•二分图判定
- 二分图判定+点染色/并查集 BestCoder Round #48 ($) 1002 wyh2000 and pupil
- UVA-11396 Claw Decomposition (二分图判定)
- 二分图判定
- POJ1112——Team Them Up!(动态规划,二分图判定)
- [HDOJ2444]The Accomodation of Students(二分图染色判定,最大匹配,匈牙利算法)
- 二分图的判定
- Claw Decomposition(二分图判定)
- 二分图的判定(C语言)
- hihocoder 1121 : 二分图一•二分图判定
- hdu2444 二分图判定+匹配