数据结构与算法 ~ 图 ~ 最小生成树 ~ 克鲁斯卡尔算法(图采用邻接表方式存储)

数据结构与算法 ~ 图 ~ 最小生成树 ~ 克鲁斯卡尔算法(图采用邻接表方式存储)

/* graph ------adjacency List */
#include
#include
#define  MAX  20
/*弧结点信息*/
struct ArcNode{
	int  adjvex;/*该弧所指向的顶点的信息*/
	int  cost;
	int  visited;
	struct ArcNode *nextarc; /*指向下一条弧的指针*/
};

struct VexNode{
	int data;/*顶点信息*/
	int muster;/*顶点所属集合*/
	struct ArcNode  *firstarc;/*指向第一条依附于该顶点的弧的指针*/
};
struct  VexNode  head[MAX];/*顶点数组*/
int  vexnum=-1;
int graphtype;

int formatlist(){
  printf("\n1---创建无向图:");
  printf("\n2---创建有向图:");
  printf("\n0---退出");
  printf("\n请输入选择:");
  scanf("%d",&graphtype);
  return graphtype;
}

void constr(struct VexNode *head,int source, int destination,int cost){
	int max;
	struct ArcNode  *newNode,*pointer;
	newNode=(struct ArcNode*)malloc(sizeof(struct ArcNode));/*分配空间*/
	if (newNode==NULL){
		printf("错误!");
		exit(0);
	}else{
       newNode->adjvex=destination;                        /*生成弧结点*/
       newNode->cost=cost;
       newNode->nextarc=NULL;
       newNode->visited=0;
       if ( head[source].firstarc==NULL)               /*头结点没有邻接点*/
                  head[source].firstarc=newNode;
      else{
		  /*头结点已有邻接点*/
		  pointer=head[source].firstarc ;
		  while  ((pointer->adjvex!=destination)&&(pointer->nextarc!=NULL) )
			  pointer=pointer->nextarc; /*找到最后一个邻接点*/
		  if (pointer->adjvex==destination){
              printf("\n两个结点相同!");
              free(newNode);
            }else{
               pointer->nextarc=newNode;                                          /*接入*/
               max=(source>destination)?source:destination; /*确定顶点的最大值*/
	       if (vexnum", pointer->adjvex,pointer->cost);
		pointer=pointer->nextarc;
	}/*while*/
	printf("\n");
   }/*for*/
  printf("\n===图的输出结束====\n");
}/*Print*/

void kruskal(struct  VexNode *head){
	struct ArcNode *pointer;
	int i,j,sum=0;
	int edgenum=0;
	int tempi,tempj,min=999;
	/*初始化工作*/
	for(i=1;i<=vexnum;i++){
		head[i].muster=i; /*设置顶点所在的集合*/
		pointer=head[i].firstarc;
		while(pointer){
			pointer->visited=0;   /*设置所有的弧为均未访问*/
			pointer=pointer->nextarc;
		}/*while*/
  }/*for*/
	printf("\n克鲁斯卡尔算法:");
	while(edgenumadjvex].muster&&pointer->visited==0&&pointer->costcost;
					tempi=i;tempj=pointer->adjvex;
				}/*if*/
				pointer=pointer->nextarc;
			}/*while*/
		}/*for*/
		printf("[%d,%d](%d)==>",tempi,tempj,min);
		sum+=min;
		MergeArc(head,tempi,tempj);/*合并集合*/
		VisitedArc(head,tempi,tempj);     /*设置此弧为均已访问*/
		if (graphtype==1) 
			VisitedArc(head,tempj,tempi);
		edgenum++;
	}/*while*/
	printf("克鲁斯卡尔算法结束\n");
	printf("权值之和%d\n",sum);
}/*kruskal*/

int VisitedArc(struct  VexNode *head,int source,int destination){
	struct  ArcNode  *pointer;
	pointer=head[source].firstarc;
	while(pointer&&pointer->adjvex!=destination)
		pointer=pointer->nextarc;
	if (pointer->adjvex==destination)  
		pointer->visited=1;
}

 int MergeArc(struct VexNode *head,int tempi,int tempj){
	int i,min;
	min=(head[tempi].muster

运行结果:


1---创建无向图:
2---创建有向图:
0---退出
请输入选择:1

请输入弧的信息:起点 终点 权值(退出-1):1 2 6

请输入弧的信息:起点 终点 权值(退出-1):1 3 1

请输入弧的信息:起点 终点 权值(退出-1):1 4 5

请输入弧的信息:起点 终点 权值(退出-1):2 3 5

请输入弧的信息:起点 终点 权值(退出-1):3 4 5

请输入弧的信息:起点 终点 权值(退出-1):2 5 3

请输入弧的信息:起点 终点 权值(退出-1):3 5 6

请输入弧的信息:起点 终点 权值(退出-1):3 6 4

请输入弧的信息:起点 终点 权值(退出-1):4 6 2

请输入弧的信息:起点 终点 权值(退出-1):5 6 6

请输入弧的信息:起点 终点 权值(退出-1):-1 -1 -1

===当前图 ====
 head[1]: [2](6)=>[3](1)=>[4](5)=>
 head[2]: [1](6)=>[3](5)=>[5](3)=>
 head[3]: [1](1)=>[2](5)=>[4](5)=>[5](6)=>[6](4)=>
 head[4]: [1](5)=>[3](5)=>[6](2)=>
 head[5]: [2](3)=>[3](6)=>[6](6)=>
 head[6]: [3](4)=>[4](2)=>[5](6)=>

===图的输出结束====

克鲁斯卡尔算法:[1,3](1)==>[4,6](2)==>[2,5](3)==>[3,6](4)==>[2,3](5)==>克鲁斯卡尔算法结束
权值之和15
请按任意键继续. . .

 

你可能感兴趣的:(数据结构与算法C语言,#,图论,数据结构与算法,图论,最小生成树,克鲁斯卡尔算法)