深度优先搜索
输入
输入的第一行包含一个正整数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();
}
}