【问题描述】 根据输入的图的邻接矩阵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 }