图的深度优先遍历和广度优先遍历

来源:互联网 发布:人工智能 医疗机器人 编辑:程序博客网 时间:2024/05/23 11:05
<pre name="code" class="cpp">//DFS和BFS实际来源于图的深度优先遍历和图的广度优先遍历//并且得到了很多功能延伸//图的深度优先遍历#include <stdio.h>#include <stdlib.h>#define INF 1000000int map[101][101];//存图int book[101];//标记int n;//点的个数int m;//边的个数int sum=0;//已遍历的点的个数void dfs(int cur)//当前所在的顶点编号{    printf("%d\n",cur);    sum++;    if(sum==n)        return;    for(int i=1;i<=n;i++){        if(map[cur][i]==1&&book[i]==0){            book[i]=1;            dfs(i);        }    }    return;}int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)      for(int j=1;j<=n;j++){        if(i==j)            map[i][j]=0;        else            map[i][j]=INF;    }    int a,b;//边的顶点    for(int i=1;i<=m;i++){//读边        scanf("%d%d",&a,&b);        map[a][b]=1;        map[b][a]=1;    }    memset(book,0,sizeof(book));    book[1]=1;    dfs(1);    return 0;}


//图的广度优先遍历#include <stdio.h>#include <stdlib.h>#define INF 100000int map[101][101];int book[100];int queue[100];int head=0;int tail=0;int n,m;int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)     for(int j=1;j<=n;j++){        if(i==j)          map[i][j]=0;        else          map[i][j]=INF;    }    int a,b;    for(int i=1;i<=m;i++){        scanf("%d%d",&a,&b);        map[a][b]=map[b][a]=1;    }    queue[tail++]=1;    book[1]=1;    while(head<tail&&tail<=n){        int cur=queue[head];        for(int i=1;i<=n;i++){            if(map[cur][i]==1&&book[i]==0){                book[i]=1;                queue[tail++]=i;            }        }        if(tail==n)            break;        head++;    }    for(int i=0;i<tail;i++)        printf("%d ",queue[i]);    return 0;}

1 0
原创粉丝点击