试设计一个算法,判断一个无向图G是否为一棵树,如果是一棵树,则算法返回true,否则返回false(思路看书,不同于书的是我们这里采用bfs)
#include <iostream>
#include <stdio.h>
#include <queue>
#define maxsize 10typedef 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不是。
在我们的程序中,我们打印了邻接表和遍历顺序来方便我们观察: