⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9-6.c

📁 这个是数据结构经典实现算法
💻 C
字号:
#include "stdio.h"
#include <stdlib.h>
#define MaxVertexNum 100
typedef enum{FALSE,TRUE}Boolean;/*FALSE为0,TRUE为1*/
Boolean visited[MaxVertexNum];
int dfn[MaxVertexNum],low[MaxVertexNum],num;
typedef int VertexType;
typedef struct node{/*边表结点*/
	int adjvex; /*邻接点域*/
	struct node *next; /*链域*/
	/*若要表示边上的权,则应增加一个数据域*/
}EdgeNode;
typedef struct vnode{ /*顶点表结点*/
	VertexType vertex; /*顶点域*/
	EdgeNode *firstedge;/*边表头指针*/
}VertexNode;
typedef VertexNode AdjList[MaxVertexNum];/*AdjList是邻接表类型*/
typedef struct ALGraph{
	AdjList adjlist;/*邻接表*/
	int n,e; /*图中当前顶点数和边数 */
}Graphic; /*对于简单的应用,无须定义此类型,可直接使用AdjList类型。*/
Graphic * graph;
void CreateGraphic(Graphic *G)
{/*建立无向图的邻接表表示*/
     	int i,j,k;
      	EdgeNode *s;
      	scanf("%d%d",&G->n,&G->e); /*读人顶点数和边数*/
      	for(i=0;i<G->n;i++){/*建立顶点表*/
        	G->adjlist[i].vertex=getchar(); /*读入顶点信息*/
        	G->adjlist[i].firstedge=NULL;/*边表置为空表*/
       	}
      	for(k=0;k<G->e;k++){/*建立边表*/
         	scanf("%d%d",&i,&j);/*读入边(vi,vj)的顶点对序号*/
         	s=(EdgeNode *)malloc(sizeof(EdgeNode)); /*生成边表结点*/
         	s->adjvex=j; /*邻接点序号为j*/
         	s->next=G->adjlist[i].firstedge;
 	        G->adjlist[i].firstedge=s; /*将新结点*s插入顶点vi的边表头部*/
         	s=(EdgeNode *)malloc(sizeof(EdgeNode));
         	s->adjvex=i; /*邻接点序号为i*/
         	s->next=G->adjlist[j].firstedge;
         	G->adjlist[j].firstedge=s; /*将新结点*s插入顶点vj的边表头部*/
        }   
} 
void DFS(Graphic *G,int i)
{ /*以vi为出发点对邻接表表示的图G进行深度优先搜索*/
    EdgeNode *p;
    printf("visit vertex:%c",G->adjlist[i].vertex);/*访问顶点vi*/
    visited[i]=TRUE; /*标记vi已访问*/
    p=G->adjlist[i].firstedge; /*取vi边表的头指针*/
    while(p)
		{/*依次搜索vi的邻接点vj,这里j=p->adjvex*/
      	if (!visited[p->adjvex])/*若vi尚未被访问*/
        	DFS(G,p->adjvex);/*则以Vj为出发点向纵深搜索*/
      	p=p->next; //找vi的下一邻接点
     }
}
void dfnlow(int u,int v)
{/*采用dfs遍历,计算dfn和low compute ,u表示起始结点,v 是u的父亲结点*/
        VertexNode ptr;
        int w;
        dfn[u] = low[u] = num++;
        for (ptr =graph->adjlist[u]; ptr; ptr= ptr->next ) 
		{
             w = ptr->vertex;
             if (dfn [w] < 0) {
				dfnlow (w,u);
                low[u] = _min(low[u], low[w]);
             }
             else if ( w != v)
                low [u] = _min( low[u], def[w]);
        }
}
void init (void)
{
        int  i;
        for ( i = 0; i <MaxVertexNum; i++ ){
           visited [i] = FALSE;
           dfn[i] = low[i] = -1;
        }
        num = 0;
}
void bicon( int  u, int  v)             
{/*计算dfn和low,以及输出G的重连通分量*/ 
    	node_pointer ptr;
        int w,x,y;
        dfn[u] = low[u] = num++;
        for (ptr =graph->adjlist[u]; ptr; ptr= ptr->nex){
             w = ptr->vertex;
             if(v!= w && dfn[w] < dfn[u])
                add (&top, u, w);                           
             if ( dfn [ w ] < 0) {        
                    bicon(w,u);
                    low[u] = _min(low[u],low[w]);
                    if (low[w] >= dfn[u]{
                      printf ("New biconnected component:");
                      do { /* delete edge from stack */
                         delete (&top, &x, &y);
                         printf (" <&d,&d>",x,y);
                      } while ( !((x == u) && ( y == w)));
                      printf ("\n");
                }     
             }  
             else if (w != v)  low[u] = _min(low[u], dfn[w]);
         }   
}
void main(void)
{
	CreateGraphic(graph);
	init();
	dfnlow(1,4);
	bicon(1,4)
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -