给定一个具有n个顶点的图,要给图上每个顶点 都上色,并且相邻的两个点之间的颜色还要不一样,问是否能最多用2中颜色进行染色? 题目保证没有重边和自环 。。
思路 : 就是一个 整个图的遍历问题 ,可以用DFS ;并用邻接表来存储 图 (vector)
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define LL long long
#define M 100000
#define inf 0x3f3f3f3f
#define mod 100009
using namespace std;
vector < int > G[M];
int color[M]; //顶点是不是被染色
int v,e;
int flag; // 是否可以两个色 涂完
void getmap()
{
scanf("%d%d",&v,&e);
memset(color,0,sizeof(color));
int i,j;
for(i=0;i<e;i++)
{
int a,b;
scanf("%d%d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
}
}
void dfs(int st,int co) // co 0 表示 为染色,1和-1 表示两种颜色
{
int i,j;
color[st]=co;
for(i=0;i<G[st].size();i++)
{
if(!color[G[st][i]]) //如果 没有染色 就染相反色
dfs(G[st][i],-co);
else
{
if(color[st]==color[G[st][i]]) //如果已经染色了,但是却是一样的,那么就 No了
{
flag=0;
return ;
}
}
}
}
void solve()
{
int i,j;
flag=1;
dfs(0,1);
for(i=0;i<v;i++)//要考虑 如果不是通路的情况 通路的话,能够遍历整个图
if(!color[i]) break;
if(i>=v&&flag) printf("Yes\n");//只有是通路且是满足题意才可以 Yes
else printf("No\n");
}
int main()
{
getmap();
solve();
return 0;
}