求邻接表中连通分量的个数

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include <iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 #define MVNum 100
 7 int vis[MVNum];
 8 typedef struct ArcNode /* 边表结点  */
 9 {
10     int adjvex;    /* 邻接点域,存储该顶点对应的下标 */
11     int info;         /* 用于存储权值,对于非网图可以不需要 */
12     struct ArcNode *nextarc; /* 链域,指向下一个邻接点 */
13 }ArcNode;
14 typedef struct VNode /* 顶点表结点 */
15 {
16     char data; /* 顶点域,存储顶点信息 */
17     ArcNode *firstarc; /* 边表头指针 */
18 }VNode, AdjList[MVNum];
19 typedef struct
20 {
21     AdjList vertices;
22     int vexnum,arcnum; /* 图中当前顶点数和边数 */
23 }ALGraph;
24 int LocateVex(ALGraph &G,char v)//找到v在邻接表G中的位置
25 {
26     for(int i=0;i<G.vexnum;i++)
27     {
28         if(G.vertices[i].data==v)
29             return i;
30     }
31     return -1;
32 }
33 void  CreateALGraph(ALGraph &G)
34 {
35     int i,j,k,v;
36     char v1,v2;
37     ArcNode *p1,*p2;
38     scanf("%d%d",&G.vexnum,&G.arcnum); // 输入顶点数和边数
39     for(v = 0;v < G.vexnum;v++) // 读入顶点信息,建立顶点表
40     {
41         scanf("%s",&G.vertices[v].data);     // 输入顶点信息
42         G.vertices[v].firstarc=NULL;     // 将边表置为空表
43     }
44     getchar();
45     for(k = 0;k < G.arcnum;k++)// 建立边表
46     {
47         scanf("%c %c",&v1,&v2);
48         getchar();
49         i=LocateVex(G,v1);
50         j=LocateVex(G,v2);
51         p1=new ArcNode; /* 向内存申请空间,生成边表结点 */
52         p1->adjvex=j;                    /* 邻接序号为j */
53         p1->nextarc=G.vertices[i].firstarc;    /* 将e的指针指向当前顶点上指向的结点 */
54         G.vertices[i].firstarc=p1;        /* 将当前顶点的指针指向e */
55 
56         p2=new ArcNode; /* 向内存申请空间,生成边表结点 */
57         p2->adjvex=i;                    /* 邻接序号为i */
58         p2->nextarc=G.vertices[j].firstarc;    /* 将e的指针指向当前顶点上指向的结点 */
59         G.vertices[j].firstarc=p2;        /* 将当前顶点的指针指向e */
60     }
61 }
62 void DFS(ALGraph G,int v)
63 {
64     int w;
65     vis[v]=1;
66     ArcNode *p;
67     p=G.vertices[v].firstarc;
68     while(p!=NULL)
69     {
70         w=p->adjvex;
71         if(!vis[w])
72         DFS(G,w);
73         p=p->nextarc;
74     }
75 }
76 
77 int main(void)
78 {
79     ALGraph G;
80     int num=0;
81     memset(vis,0,sizeof(vis));
82     CreateALGraph(G);
83     for(int v = 0;v < G.vexnum;v++) // 读入顶点信息,建立顶点表
84     {
85         if(!vis[v])
86         {
87             DFS(G,v);
88             num++;
89         }
90     }
91     printf("%d\n",num);
92     return 0;
93 }

输入:

8 7
A B C D E F G H
A B
B D
C D
A C
E F
E G
F G

输出:

3

猜你喜欢

转载自www.cnblogs.com/diandianer/p/9971153.html
今日推荐