数据结构之连通图算法

#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\n", 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\n", 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 */

 

posted @ 2017-12-13 19:22  爱记录一切美好的微笑  阅读(2625)  评论(0编辑  收藏  举报