方法:从一个顶点出发深度优先遍历可遍历所有结点,并且没有环或只有n-1条边。
若判断有环:可以在遍历时记住父结点,v的子结点w已被访问,且不是结点v的父结点,则存在环。
若判断只有n-1条边,循环一下很容易得到。用拓扑排序不可,因为无向图各顶点都有入度.
假设不存在自环与平行边
#include <stdlib.h>
#include <stdio.h>
struct node /* 图顶点结构定义 */
{
int vertex; /* 顶点数据信息 */
struct node *nextnode; /* 指下一顶点的指标 */
};
const int vertexnum = 3; /*顶点的数目*/
const int instance = 4;
typedef struct node *graph; /* 图形的结构新型态 */
struct node head[vertexnum+1]; /* 图形顶点数组 */
int visited[vertexnum+1]; /* 遍历标记数组 */
int id[vertexnum+1]; /*标记连通分量的编号*/
int count = 0; /*连通分量编号*/
int edgenum = 0; /*边的数目*/
/********************根据已有的信息建立邻接表********************/
void creategraph(int node[instance][2],int num)/*num指的是图的边数*/
{
graph n