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