DS||dfs and bfs

深度优先搜索
输入
输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。 以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。 输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。
输出
每一行输出无向图中的一棵生成树,表示按照题目描述中的深度优先遍历算法遍历相应的连通分量的访问顶点顺序。每个整数后输出一个空格,并请注意行尾输出换行。
样例输入 Copy
6
0 0 0 1 0 0
0 0 1 1 0 0
0 1 0 1 0 0
1 1 1 0 0 0
0 0 0 0 0 1
0 0 0 0 1 0
样例输出 Copy
0 3 1 2
4 5

#include <iostream>
#include <stdio.h>
using namespace std;
int s[999][999],map[999],n,m=0;

int dfs(int pos){
    int i;
    printf("%d ",pos);
    m++;
    if(m!=n)
    {
	    for(i=0;i<n;i++)
	    {
	        if(s[pos][i]==1&&map[i]==0)
	        {
	            map[i]=1;
	            dfs(i);
	        }
	        
	    }
	}
    return 0;
}
int main()
{
    int i,j;
	scanf("%d",&n);
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            scanf("%d",&s[i][j]);
    for(i=0;i<n;i++){
    	if(map[i]!=1){
    		map[i]=1;
    		dfs(i);
    		printf("\n");
		}
	}
}

广度优先搜索
输入
输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。 以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。 输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。
输出
只有一行,包含n个整数,表示按照题目描述中的广度优先遍历算法遍历整个图的访问顶点顺序。每个整数后输出一个空格,并请注意行尾输出换行。
样例输入 Copy
4
0 0 0 1
0 0 1 1
0 1 0 1
1 1 1 0
样例输出 Copy
0 3 1 2

#include <iostream>
#include <stdio.h>
#include <deque>
using namespace std;
int s[999][999],map[999],n,m=0;
deque <int> q;
int main()
{
    int i,j;
	scanf("%d",&n);
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            scanf("%d",&s[i][j]);
    q.push_back(0);
    map[0]=1;
    while(!q.empty()){
    	printf("%d ",q.front());
    	for(i=0;i<n;i++){
    		if(s[q.front()][i]==1&&map[i]==0){
    			q.push_back(i);
    			map[i]=1;
			}
		}
		q.pop_front();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值