题目:
给定一个具有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;
}