图的应用之——图的连通

题目描述

给定一个图的邻接矩阵,请判断该图是否是连通图。连通图:任意两个顶点之间都有路径。

--程序要求--

若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio

程序中若include多过一个头文件,不看代码,作0分处理

不允许使用第三方对象或函数实现本题的要求

输入

第1行输入一个整数k,表示有k个测试数据

第2行输入一个整数n,表示有n个结点

从第3行起到第n+2行输入一个邻接矩阵,其中Matrix[i,j]=1表示第i,j个结点之间有边,否则不存在边。

接下来是第2到第k个测试数据的结点数和邻接矩阵

输出

输出Yes or No表示图是否是强连通图

样例输入

2

4

0 1 1 1

1 0 1 1

1 1 0 1

1 1 1 0

7

0 1 0 0 0 0 0

0 0 1 1 0 0 0

1 0 0 0 0 0 0

1 0 1 0 0 0 0

0 0 0 0 0 1 1

0 1 0 0 0 0 0

0 0 0 1 0 1 0

样例输出

Yes

No

#include<iostream>
using namespace std;
  
const int maxlen= 20;
  
class Map{
    private:
        bool visit[maxlen];
        int matrix[maxlen][maxlen];
        int vexnum;
        void DFS(int v){
            int w, i, k;
              
            visit[v]= true;
            //cout<<v<<' ';
            sum++;
              
            int *adjvex= new int[vexnum];
              
            for(i= 0; i< vexnum; i++)
              adjvex[i]= -1;
                
            k= 0;
              
            for(i= 0; i< vexnum; i++){
                if(matrix[v][i]){
                    adjvex[k++]= i;
                }
            }
              
            i= 0;
            for(w= adjvex[i++]; w>= 0; w= adjvex[i++]){
                  
                if(!visit[w])
                  DFS(w);
            }
        }
    public :
        int sum;
        void setmatrix(int vnum, int mx[maxlen][maxlen]){
            int i, j;
            vexnum= vnum;
            for(i= 0; i< maxlen; i++){
                for(j= 0; j< maxlen; j++){
                    matrix[i][j]= 0;
                }
            }
              
            for(i= 0; i< maxlen; i++){
                for(j= 0; j< vexnum; j++){
                    matrix[i][j]= mx[i][j];
                }
            }
        }
        void DFSTraverse(int v){
             
              
            for(int i= 0; i< vexnum; i++)
              visit[i]= false;
            int k= 0;  

             DFS(v);
        }
        int tf(){
            for(int i= 0; i< vexnum; i++){
                 
                for(int j= 0; j< vexnum; j++)
                  visit[j]= false;
                  sum= 0;
                DFSTraverse(i);

                 
                if(sum!= vexnum)
                  return 0;
            }
             
            return 1;
        }
};
  
int main(){
    int t;
    cin>>t;
    while(t--){
        int n; 
        cin>>n;
        int mx[maxlen][maxlen];
          
        for(int i= 0; i< n; i++)
          for(int j= 0; j< n; j++)
           cin>>mx[i][j];
          
       
        Map* map;
        map= new Map();
        map->setmatrix(n, mx);
         
        if(map->tf())
          cout<<"Yes";
        else
          cout<<"No";
        cout<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41879093/article/details/83821786