输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。
输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。
in
4 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0
ou
0 1 3 2
//两种方法
//自己设计
#include<stdio.h>
#include<stdlib.h>
#define Max 50
int visited[Max];
int a[50][50];
int n;
void DFS(int i)
{
if(!visited[i])
printf("%d ",i);
visited[i]=1;
for(int j=0;j<n;j++)
{
if(!visited[j]&&a[i][j])
{
DFS(j);
}
}
}
void DFSTraverse(void)
{
for(int i=0;i<n;i++)
visited[i]=0;
for(int i=0;i<n;i++)
{
if(!visited[i]);
DFS(i);
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
DFSTraverse();
}
//eg2
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define Max 50
bool visited[Max];
int a[50][50];
int n;
void VisitFunc(int i)
{
if(!visited[i])
printf("%d ",i);
}
int FirstAdjVex(int i)
{
for(int j=0;j<n;j++)
if(a[i][j])
return j;
return -1;
}
int NextAdjVex(int i,int w)
{
for(int j=w+1;w<n&&j<n;j++)
{
if(a[i][j])
return j;
}
return -1;
}
void DFS(int i)
{
int w;
VisitFunc(i);
visited[i]=true;
for(int j=FirstAdjVex(i);j!=-1;j=NextAdjVex(i,j))
{
if(!visited[j])
{
DFS(j);
}
}
}
void DFSTraverse(void)
{
for(int i=0;i<n;i++)
visited[i]=false;
for(int i=0;i<n;i++)
{
if(!visited[i]);
DFS(i);
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
DFSTraverse();
}