首先图的储存结构是结构体+head数组。。。其实head数组保存的
struct node{ int v; int next;}V[200*200];
比如有
1 2
1 3
1 4的点边关系那么V[head[1]].v=4;V[head[2]].v=1,V[head[3]].v=1;
现在讲讲如何判断图是不是二分图,首先对任意没染色的点进行染色,之后判断与其相邻的点若是没染色则染上与其相邻的顶点不同的颜色,若是染过色且与相邻的顶点颜色相同则不是二分图==
判断的过程用dfs来实现
#include#include #include #include using namespace std;struct node{ int v; int next;}V[200*200];int tol; int head[200];int col[200];void init(){ int tol=0; memset(head,-1,sizeof(head));}void add(int u,int v){ V[tol].v=v; V[tol].next=head[u]; head[u]=tol++;}bool bldfs(int u,int co){ int i,v; col[u]=co; for(i=head[u];i!=-1;i=V[i].next) { v=V[i].v; if(col[v]==co) return false; if(col[v]==-1&&!bldfs(v,co^1)) return false; } return true;}int main(){ int n,m; while(scanf("%d",&n)!=EOF&&n) { init(); int u,v; scanf("%d",&m); for(int i=0;i