小工具知识网

当前位置: 首页 > 行业知识 > 采用深度优先搜索-DFS遍历图

行业知识

采用深度优先搜索-DFS遍历图

2026-10-20 07:34:48 来源:互联网转载

相关概念

连通:���向图中的两个顶点可互相到达

连通图:图中任意两顶点均可互相到达

连通分量:极大连通子图

强连通:有向图中的一个顶点可到达另一个顶点

连通图:图中任意两顶点都强连通

连通分量:极大强连通子图

遍历实现

1.用邻接矩阵实现

const int maxn=100;const int inf=100000000;int G[maxn][maxn];bool isvisit[maxn]={false};int num;void DFS(int a,int deep){    isvisit[a]=true;//改为已访问    for(int i=0;i        if(isvisit[i]==false&&G[a][i]!=inf)        //访问离a最近的一个未被访问且与a有关系的结点        DFS(i,deep+1);    }}void DFStrave(){    for(int i=0;i        if(isvisit[i]==false)        DFS(i,1);    }}false};vector    isvisit[a]=true;    //遍历顶点a的邻接列表-即相关的边    for(int i=0;i        int value=node[a][i];        if(isvisit[value]==false)        DFS(value,deep+1);    }}void DFStrave(){    for(int i=0;i    int cnum;    string head;};int G[maxn][maxn];//用邻接表法实现对图的存储int V[maxn];//记录点权:要找头目bool isvisit[maxn]={false};//记录是否已访问int group,limit,value;int num=0;string vertex1,vertex2;//顶点map  if(stringToInt.find(str)!=stringToInt.end()){//再次传入,直接返回即可      return stringToInt[str];//返回编号}else{//第一次传入,为其编号        stringToInt[str]=num;//第一个编号为0        intToString[num]=str;//同时为其相反操作编号        return num++;//记录总个数:先返回编号再++}}void DFS(int index,int &head,int &numMemeber,int &sumValue){    numMemeber++;//记录成员    isvisit[index]=true;    if(V[index]V[head])    head=index;//更新,找点权最大的    for(int i=0;i        if(G[index][i]0){            sumValue+=G[index][i];            G[index][i]=G[i][index]=0;//无向图防止乱加            if(isvisit[i]==false)        DFS(i,head,numMemeber,sumValue);        }    }}void DFStrave(){    for(int i=0;i        int head=i,numMemeber=0,sumValue=0;        if(isvisit[i]==false){            DFS(i,head,numMemeber,sumValue);        }        //边算值边判断        if(numMemeber2&&sumValuevalue){            crimes[intToString[head]]=numMemeber;//犯罪集团信息        }    }}int main(){    cingroup>>limit;    for(int i=0;i        cin>vertex1>>vertex2>>value;        int ver1=change(vertex1);        int ver2=change(vertex2);        //记录点权        V[ver1]+=value;        V[ver2]+=value;        //记录边权:相当于创建一个无向图        G[ver1][ver2]+=value;        G[ver2][ver1]+=value;    }    DFStrave();    cout

上一篇:内部dns服务器怎么建?

下一篇:揭秘代码砍价秘籍,掌握技巧,轻松谈判!