求鄰接表中連通分量的個數
阿新 • • 發佈:2018-11-16
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; 24int 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