试设计一个算法,判断一个无向图G是否为一棵树,如果是一棵树,则算法返回true,否则返回false(思路看书,不同于书的是我们这里采用bfs)
#include <iostream>
#include <stdio.h>
#include <queue>
#define maxsize 10
typedef struct node{
int data;
struct node* next;
}node,*pnode;
pnode buynode(int x)
{
pnode tmp=(pnode) malloc(sizeof (node));
tmp->data=x,tmp->next= nullptr;
return tmp;
}
pnode * graph(int point)
{
pnode *a=(pnode*) malloc(sizeof (pnode)*point);
for(int i=0;i<point;i++)
a[i]= buynode(i);
return a;
}
void figure1(pnode* g)
{
g[0]->next= buynode(1);
g[0]->next->next= buynode(2);
g[0]->next->next->next= buynode(3);
g[1]->next= buynode(0);
g[2]->next= buynode(0);
g[3]->next= buynode(0);
}
void print(pnode* p,int point)
{
printf("the figure is:\n");
for(int i=0;i< point;i++)
{
pnode tmp=p[i];
while(tmp){
printf("%3d",tmp->data);
tmp=tmp->next;
}
puts("");
}
}
void figure2(pnode* g)
{
for(int i=0;i<4;i++)
{
pnode tmp=g[i];
for(int j=0;j<4;j++)
{
if (i!=j)
{
tmp->next = buynode(j);
tmp = tmp->next;
}
}
}
}
void figure3(pnode* g)
{
g[0]->next= buynode(1);
g[0]->next->next= buynode(2);
g[1]->next= buynode(0);
g[1]->next->next= buynode(3);
g[1]->next->next->next= buynode(4);
g[2]->next= buynode(0);
g[3]->next= buynode(2);
g[4]->next= buynode(2);
}
void figure4(pnode* g)
{
g[0]->next= buynode(1);
g[0]->next->next= buynode(2);
g[1]->next= buynode(0);
g[1]->next->next= buynode(3);
g[1]->next->next->next= buynode(4);
g[2]->next= buynode(0);
g[3]->next= buynode(2);
g[3]->next->next= buynode(4);
g[4]->next= buynode(2);
g[4]->next->next= buynode(3);
}
bool is_tree(pnode* g)
{
int point=0,side=0;
std::queue<pnode> record;
record.push(g[0]);
int* visited=(int *) malloc(sizeof (int)*maxsize);
for (int i = 0; i < maxsize; ++i)
visited[i] = 0;
printf("the visit order:");
visited[0]=1;
while(!record.empty())
{
pnode head=record.front();
point++;
record.pop();
printf("%3d",head->data);
while(head->next) {
side++;
if(!visited[head->next->data]) {//没有访问过
record.push(g[head->next->data]);
visited[head->next->data]=1;//被访问过了
}
head = head->next;
}
}
puts("");
printf("point:%3d,side:%3d\n",point,side);
return point==((side/2)+1);
}
int main() {
pnode* g1= graph(4);
figure1(g1);
print(g1,4);
if(is_tree(g1)) printf("g1 is a tree\n");
else printf("g1 is just a graph\n");
puts("");
pnode* g2= graph(4);
figure2(g2);
print(g2,4);
if(is_tree(g2)) printf("g2 is a tree\n");
else printf("g2 is just a graph\n");
puts("");
pnode* g3= graph(5);
figure3(g3);
print(g3,5);
if(is_tree(g3)) printf("g3 is a tree\n");
else printf("g3 is just a graph\n");
puts("");
pnode* g4= graph(5);
figure4(g4);
print(g4,5);
if(is_tree(g4)) printf("g4 is a tree\n");
else printf("g4 is just a graph\n");
return 0;
}
对于上面的代码我们用了四张图进行测试,这四张图分别如下:
其中只有1和3是树,2和4不是。
在我们的程序中,我们打印了邻接表和遍历顺序来方便我们观察: