zoukankan      html  css  js  c++  java
  • 数据结构之连通图算法

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #define MAXN 110
    
    using namespace std;
    
    typedef char VertexType;
    typedef int EdgeType;
    int k;
    int s[MAXN];
    int vis[MAXN];
    typedef struct
    {
        char vexes[MAXN];
        int maps[MAXN][MAXN];
        int numVexes, numEdge;
    }MGraph;
    ///用邻接矩阵创建图
    void CreateGraph(MGraph &G)
    {
        int u, v;
        printf("输入顶点数和边数:");
        scanf("%d %d", &G.numVexes, &G.numEdge);
    
        getchar();
        for(int i=0; i<G.numVexes; i++)
            scanf("%c", &G.vexes[i]);
    
        for(int i=0; i<G.numVexes; i++)
            for(int j=0; j<G.numVexes; j++)
                G.maps[i][j]=0;
    
        for(int i=0; i<G.numEdge; i++)
        {
            scanf("%d %d", &u, &v);
            G.maps[u][v]=G.maps[v][u]=1;
        }
    }
    ///从顶点i起深度优先遍历
    void DFS(MGraph G, int u)
    {
        vis[u]=1;
        putchar(G.vexes[u]);
        s[k++]=u;
        for(int i=0; i<G.numVexes; i++)
            if(G.maps[u][i]&&!vis[i])
                DFS(G, i);
    }
    ///深度优先遍历
    int DFSM(MGraph G)
    {
        int cnt=0;
        memset(vis, 0, sizeof(vis));
        for(int i=0; i<G.numVexes; i++)
        {
            if(!vis[i])
            {
                k=0;
                memset(s, 0, sizeof(s));
                cnt++;
                DFS(G, i);
                printf(":");
                for(int z=0; z<k; z++)
                    printf(" %d", s[z]);
                printf("--%d
    ", k);
            }
        }
        return cnt;
    }
    ///求连通分量的个数
    int Count_Conn(MGraph G)
    {
        int cnt=0;
        memset(vis, 0, sizeof(vis));
        for(int v=0; v<G.numVexes; v++)
        {
            if(!vis[v])
            {
                cnt++;
                DFS(G, v);
            }
        }
        return cnt;
    }
    int main()
    {
        MGraph G;
        CreateGraph(G);
        int Count=DFSM(G);
        printf("%d
    ", Count);
        return 0;
    }
    /*
    样例输入:
    13 13 ABCDEFGHIJKLM 0 1 0 2 0 5 0 11 1 12 3 4 6 7 6 8 6 10 9 11 9 12 11 12 7 10 样例输出: ABMJLCF:0 1 12 9 11 2 5--7 DE:3 4--2 GHKI:6 7 10 8-- 4 3 */
  • 相关阅读:
    struts2基础
    javaEE环境搭建-eclipse
    geth
    redis常用命令
    angular-ui-select 下拉框支持过滤单选多选解决方案(系列一)
    angularjs中向html页面添加内容节点元素代码段的两种方法
    modal
    弹性布局
    自定义鼠标样式
    angularjs指令弹框点击空白处隐藏及常规方法
  • 原文地址:https://www.cnblogs.com/w-y-1/p/8034515.html
Copyright © 2011-2022 走看看