前言
日常输出一些题目
正文
题目一:
编写DFS非递归
void unrc_DFS(ALGraph G,int v){
ArcNode *p;
initStack(s);
visited[v]=true;
push(s,v);
while(!isEmpty(s)){
pop(s,p);visit(p);//弹出栈顶结点并访问
p=G.vertices[v].firstarc
int w=p.adjvex;
/*获取每一个结点的firstarc和nextarc放入栈中(有点类似BFS把同一层的先入栈)*/
while(p){
if(visted[w]==false){
push(s,w);
visited[w]=true
}
p=p->nextarc;
}
}
}
题目二
判断一个无向图G是否为一颗树
关键:在图中,若是无环路的连通图或是边数等于结点数-1的连通图,则该无向图是一棵树
bool istree(ALGraph G){
int i,Vnum=0,Lnum=0;
int visited[MaxSxize];
for(i=0;i<G.vexnum;i++){
visited[i]=0;
}
DFS_TREE(G,1,Vnum,Lnum,visited);
if(Vnum==G.vexnum&&Lnum==2*(G.vexnum-1))//若结点数(连通)和边数 满足条件
return true;
else
return false;
}
void is DFS_TREE(ALGraph G,int v,int *Vnum,int *Lnum,int visited[]){
visited[v]=true;
Vnum++;//结点数加1
ArcNode *p;
p=G.vertices[v].firstarc;
while(p){
Lnum++//边数加1
if(!visited[p->adjvex])
DFS_TREE(G,p->adjvex,Vnum,Lnum,visited)
p=p->nextarc;
}
}
**注意:**边数在遍历的时候走了两边,因为之前访问过的顶点也走了一遍。