作者: Vincy_ivy | 来源:发表于2019-06-16 15:25 被阅读0次

    记顶点和边的集合位V和E,[V]和[E]表示顶点和边的个数,在V重,顶点被编号位0~[V]-1

    1.邻接矩阵

    • 邻接矩阵使用[V]*[V]的二维数组来表示图。g[i][j]表示的是顶点i和顶点j的关系,如果i和j之间有边相连,那么g[i][j]和g[j][i]就设为1,否则为0(无向图)


      无向图和对应的邻接矩阵
    • 如果是有向图的话,i是起点,j是终点


      有向图和对应的邻接矩阵
    • 带权图:g[i][j]表示的是顶点i到顶点j的边的权值。在边不存在的情况下,将其赋值为INF(较大的常数)


      带权图和对应的邻接矩阵

       

    2.邻接表

    邻接表

     

    3.图的搜索

    title

    n=3;输出No
    思路:如果只用2种颜色,那么给定一个顶点的颜色后,和它相邻的顶点的颜色也就确定了。因此,选择任意一个顶点出发,依次确定相邻顶点的颜色,就可以判断是都可以被2种颜色染色了//用深搜。

    这只是个模板【参考博客//cscec.com.cn/whpc_new/whal/201712/2775290.html】

    #include<cstdio>
    #include<iostream>
    #include<bits/stdc++.h>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    vector<int> G[1000];//图
    int V;//顶点数
    int color[1000];//顶点i的颜色(1 or -1)
    
    //把顶点染成1或-1
    bool dfs(int v,int c){
        color[v]=c;//把顶点v染成颜色c
        for(int i=0;i<G[i].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; 
    } 
    
    void solve(){
        for(int i=0;i<V;i++){
            if(color[i]==0){
                //如果顶点i还没被染色,则染成1
                if(!dfs(i,1)){
                    printf("No\n");
                    return ;
                } 
            }
        }
        printf("Yes\n");
    }
    

    相关文章

      网友评论

          本文标题:

          本文链接:https://www.haomeiwen.com/subject/gerifctx.html