二分图 【dfs】+【vector】

给定一个具有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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值