深度优先搜索

来源:互联网 发布:知乎 高中生 编辑:程序博客网 时间:2024/06/10 22:34

按深度优先搜索遍历一个连通分支,用邻接矩阵存储。
输入:给出顶点个数,默认是从1到n的,给出边数及相关顶点与距离
输出:按顺序给出访问的顶点

#include<stdio.h>int e[101][101];int book[101]={0};int sum=0,n;void dfs(int cur){    printf("%d ",cur);    sum++;    if(sum==n)  return;    int i;    for(i=1;i<=n;i++){        if(e[cur][i]==1 && book[i]==0){            book[i]=1;            dfs(i);        }    }}int main(){ //深搜    int i,j;    int a,b;    int m; //要输入的边数    printf("n:  m:\n");    scanf("%d %d",&n,&m);    for(i=1;i<=n;i++)  //初始化二维矩阵        for(j=1;j<=n;j++){            if(i==j) e[i][j]=0;            else    e[i][j]=e[j][i]=99999; //规定99999为正无穷        }    printf("p1: p2:\n");    for(i=0;i<m;i++){        scanf("%d %d",&a,&b);        e[a][b]=e[b][a]=1;    }    book[1]=1;    dfs(1);    return 0;}

C++版

#include<iostream>#include<cstring>#include<vector>#include<queue>using namespace std;const int dif = 999999999;int e[101][101];//邻接矩阵int book[101];int sum=0;//记录访问过得顶点数int n;//顶点数int m,v1,v2,d;//边数及边的信息void ini(){    cin >> n;    for(int i=1;i<=n;i++){        for(int j=1;j<=n;j++){            if(i==j)                e[i][j]=0;            else                e[i][j]=dif;        }    }    cin >> m;    for(int i=0;i<m;i++){        cin >> v1 >> v2 >> d;        e[v1][v2]=d;        e[v2][v1]=d;    }}void dfs(int x){    cout << x << " ";    sum++;    if(sum==n)  return;    for(int i=1;i<n;i++){        if(e[x][i]<dif && book[i]==0){            book[i]=1;            dfs(i);        }    }}int main(){    ini();    book[1]=1;    dfs(1);    return 0;}