DFS一个图并求出它的连通分支个数

来源:互联网 发布:带网络变压器的rj45 编辑:程序博客网 时间:2024/05/17 22:00

深度优先算法:选择一个点依次DFS它所连接的点,并且每个点会有一个visited标记表示是否被遍历。

连通图:如果一个图中任意两点都存在路径连接,那么这个图称为连通图

连通分支大小:遍历这个图里的所有点,有多少次重新选取一个点从它开始DFS这个图就有多少个连通分支

代码:

#include <fstream>#include<iostream>#include<stdlib.h>using namespace std;void visit(int* visited, int num){    visited[num]=1;}void DFS(int ph[][10], int *visited, int num){    visit(visited, num);    for(int i=num+1; i<10; i++)    {        if(ph[num][i]==1)        {            if(!visited[i])            {                visit(visited, i);                DFS(ph, visited, i);            }        }    }}int main() //程序从这里开始运行{    int ph[10][10];    int visited[10]={0};    int flag=0;    char ch;    ifstream OpenFile("tu.txt");    for(int j=0; j<10; j++)    {        for(int k=0; k<10; k++)        {            OpenFile.get(ch);            ph[j][k] = (int)ch-48;        }    }    cout << "本图邻接矩阵为:" << endl;    for(int j=0; j<10; j++)    {        for(int k=0; k<10; k++)        {            cout << ph[j][k] << "   ";        }        cout << endl;    }    for(int j=0; j<10; j++)    {        if(!visited[j])        {            DFS(ph, visited, j);            flag++;        }    }    cout << "本图连通分支有 " << flag <<" 个。";    OpenFile.close();}