这题还真太简单了……不过我的方法效率有点低。改天要去看看大牛怎么做。
bfs:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn=210;
bool G[maxn][maxn],vis[maxn],color[maxn];
int n;
int q[maxn*maxn];
bool bfs()
{
int front=0,rear=0;
q[rear++]=0;
color[0]=true;
vis[0]=true;
while(front<rear)
{
int u=q[front++];
for(int i=0;i<n;i++)
if(G[u][i])
{
if(!vis[i])
{
q[rear++]=i;
vis[i]=true;
color[i]=!color[u];
}
else if(color[i]==color[u]) return false;
}
}
return true;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("10004.txt","r",stdin);
#endif
while(scanf("%d",&n)==1 && n)
{
memset(G,0,sizeof(G));
memset(vis,0,sizeof(vis));
int I;
scanf("%d",&I);
int i,j,k;
for(i=0;i<I;i++)
{
scanf("%d%d",&j,&k);
G[j][k]=G[k][j]=true;
}
if(bfs()) printf("BICOLORABLE.\n");
else printf("NOT BICOLORABLE.\n");
}
return 0;
}
dfs:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn=210;
bool G[maxn][maxn],vis[maxn],color[maxn];
int n;
int q[maxn*maxn];
bool dfs(int u)
{
for(int i=0;i<n;i++)
if(G[u][i])
{
if(!vis[i])
{
vis[i]=true;
color[i]=!color[u];
return dfs(i);
}
else if(color[i]==color[u]) return false;
}
return true;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("10004.txt","r",stdin);
#endif
while(scanf("%d",&n)==1 && n)
{
memset(G,0,sizeof(G));
memset(vis,0,sizeof(vis));
int I;
scanf("%d",&I);
int i,j,k;
for(i=0;i<I;i++)
{
scanf("%d%d",&j,&k);
G[j][k]=G[k][j]=true;
}
color[0]=false;
if(dfs(0)) printf("BICOLORABLE.\n");
else printf("NOT BICOLORABLE.\n");
}
return 0;
}