二分图 【dfs】+【vector】

给定一个具有n个顶点的图,要给图上每个顶点 都上色,并且相邻的两个点之间的颜色还要不一样,问是否能最多用2中颜色进行染色? 题目保证没有重边和自环 。。
思路 : 就是一个 整个图的遍历问题 ,可以用DFS ;并用邻接表来存储 图 (vector)
代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#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;iint 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;iif(!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//要考虑 如果不是通路的情况 通路的话,能够遍历整个图
    if(!color[i]) break;

    if(i>=v&&flag) printf("Yes\n");//只有是通路且是满足题意才可以 Yes 
    else printf("No\n");
}
int main()
{
    getmap();
    solve();
    return 0;
}

你可能感兴趣的:(DFS,+,BFS,STL)