无向图的遍历连通性

【问题描述】 根据输入的图的邻接矩阵A,判断此图的连通分量的个数。
【输入形式】第一行为图的结点个数n,之后的n行为邻接矩阵的内容,每行n个数表示。其中A[i][j]=1表示两个结点邻接,而A[i][j]=0表示两个结点无邻接关系。
【输出形式】输出此图连通分量的个数。
【样例输入】
5
0 1 1 0 0
1 0 1 0 0
1 1 0 0 0
0 0 0 0 1
0 0 0 1 0
【样例输出】
2
【样例说明】邻接矩阵中对角线上的元素都用0表示。(单个独立结点,即与其它结点都没有边连接,也算一个连通分量)

 

 1 /tps://www.cnblogs.com/ITgaozy/p/5187483.html
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 #define MAX 1000
 5 #define MAX_NUM 100 //最大顶点数
 6 typedef struct Graph{
 7 
 8    char vertex[MAX_NUM];//节点信息 各个顶点的名字 比如叫ABCD啊
 9    int arcs[MAX_NUM][MAX_NUM];//图的邻接矩阵  就是如果顶点带权值的时候 也是存在这 就是具体的数字,不是0/1了,0的话估计代表无穷
10    int vertexs,brim;//前者是节点数 后者是矩阵边数
11 }Graph;
12 int visited[MAX];//是否访问过 给dfs用的全局数组
13 void CreateGraph(Graph *graph){
14          int i,j;
15          cin>>graph->vertexs;//输入图的节点个数
16          for(i=0;i<graph->vertexs;i++){
17             for(j=0;j<graph->vertexs;j++){
18                 cin>>graph->arcs[i][j];//输入矩阵信息
19             }
20          }
21 }
22 void DFS(Graph graph,int v){ //从i这个节点开始走 一直走到自己能走到的头
23          visited[v]=1;//访问过这个节点了 先变成1
24          int i;
25          for(i=0;i<graph.vertexs;i++){
26             if(graph.arcs[v][i]!=0&&visited[i]!=1){
27                 DFS(graph,i);
28             }
29          }
30 
31 
32 }
33 int main(){
34 
35     Graph g;
36     int i,sum=0;
37     CreateGraph(&g);//这里传递过去的是地址 因为要更改信息啊
38     visited[MAX]=0;//初始化为0;
39     for(i=0;i<g.vertexs;i++){
40         if(visited[i]!=1){//还没有被访问过的话
41             DFS(g,i);//这里就是值传递了
42             sum++;
43         }
44     }
45      cout<<sum<<endl;
46      return 0;
47 }

 

posted @ 2019-06-12 14:27  像走了一光年  阅读(1261)  评论(0编辑  收藏  举报