您的位置:首页 > 其它

二分图判定 (挑战程序设计竞赛)

2017-04-07 22:14 218 查看
题目:

给定一个具有n个顶点的图,要给图上每个顶点染色,并且要使相邻的顶点颜色不同。问是否能最多用2种颜色进行染色?题目保证没有重边和自环。

限制条件:1<=n<=1000

input:

3 3(顶点数 边数)

0 1(有一条0到1的边)

0 2(有一条0到2的边)

1 2(有一条1到2的边)

output:

no

先用邻接表将点之间的关系存储下来,然后依次搜索每一个顶点,依次确定相邻顶点的颜色,如果染色冲突则不能被两种颜色着色。因为本题是连通图,如果题目没有说明,那么有可能图不连通,则需要依次检查每一个顶点是否已经访问过。

附上代码:

#include<bits/stdc++.h>

using namespace std;
const int maxn=1000+5;
vector<int>G[maxn];//图
int V;//顶点数
int n;//有向关系数
int color[maxn];//顶点i的颜色(1或-1)

//把顶点染成1或-1
bool dfs(int v,int c)
{
color[v]=c;//把顶点染成c
for(int i=0;i<G[v].size();i++)
{
//如果相邻的顶点同色,则返回false
if(color[G[v][i]]==c) return false;
//如果相邻顶点没有被染色,则染成-c
if(color[G[v][i]]==0&&!dfs(G[v][i],-c)) return false;
}
//如果所有顶点都染色了,则返回true
return true;
}

int main()
{
int s,g;
cin>>V>>n;
//实现邻接表
for(int i=0;i<n;i++)
{
cin>>s>>g;
G[s].push_back(g);
}
//图的操作
for(int i=0;i<V;i++)
{
if(!color[i])
{
//如果顶点还没有被染色,则染成1
if(!dfs(i,1)) printf("no\n");return 0;
}
}
printf("yes\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息