图搜索

图的遍历方式有深度优先搜索(一条道走到底)和宽度优先搜索(一层一层的开始遍历)这两种。

DFS

void DFS(int v){
    visited[v]=true;
    for(v 的每个邻接点w){
        if(!visited[w]){
            DFS(w);
        }
    }
}

BFS

void BFS(int v){
    visited[v]=true;
    Enqueue(v,Q);
    while(!IsEmpty(Q)){
        v=Dequeue(Q);
        for(v 的每个邻接点w){
            Enqueue(w,Q);
            visited[w]=true;
        }
    }
}

例题

描述

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

题解

如果是连通图,那么一次dfs就可以访问到所有的顶点。题目没有显示说明,有可能不连通,这样就需要依次检查每个顶点是否访问。

代码

#include 
#include
using namespace std;

bool dfs(int v,int c){
    color[v]=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;
    }
    return true;
}
int main()
{
    for(int i=0;i<n;i++){
        if(color[i]==0){
            if(!dfs(i,1)){
                printf("No\n")
                return 0;
            }
        }
    }
    printf("Yes\n");
    return 0;
}

你可能感兴趣的:(图搜索,图搜索)