求鄰接表中連通分量的個數


 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM