题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1015
题目大意:判断给定的图是否是二分图,题意要求从0节点开始。
代码如下:广搜
#include<stdio.h>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
vector <int> v[205];
int vis[205];
int x;
void bfs()
{
memset(vis,0,sizeof(vis));
queue<int> q;
x=0;
vis[x]=1;
q.push(x);
while(!q.empty())
{
x=q.front();
q.pop();
for(int i=0;i<v[x].size();i++)
{
int y=v[x][i];
if(vis[y]==0)
{
vis[y]=(vis[x]==1?2:1);
q.push(y);
}
else
{
if(vis[x]==vis[y])
{
printf("NOT BICOLORABLE.\n");
return;
}
}
}
}
printf("BICOLORABLE.\n");
return;
}
int main()
{
int T,n,a,b;
while(~scanf("%d%d",&T,&n))
{
for(int i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
bfs();
for(int i=0;i<=T;i++)
v[i].clear();
}
return 0;
}
深搜如下:
#include<stdio.h>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
vector <int> v[205];
int vis[205],x;
void dfs(int u)
{
for(int i=0;i<v[u].size();i++)
{
if(vis[v[u][i]]==0)
{
vis[v[u][i]]=(vis[u]==1?2:1);
dfs(v[u][i]);
}
else if(vis[v[u][i]]==vis[u])
{
x=0;
return;
}
}
return;
}
int main()
{
int T,n,a,b;
while(~scanf("%d%d",&T,&n))
{
x=1;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
vis[0]=1;
dfs(0);
if(x) printf("BICOLORABLE.\n");
else printf("NOT BICOLORABLE.\n");
for(int i=0;i<=T;i++)
v[i].clear();
}
return 0;
}