//建立图的邻接矩阵储存结构
#include <stdio.h>
#include <string.h>
#define M 20
#define FINITY 5000 

typedef struct 
{
	char vexs[M];
	int edges[M][M];
	int n,e; 
}Mgraph;

typedef struct edgedata
{
	int begin,end;
	int length;
}edge;
 
//c=0,表示建立无向图
void creat(Mgraph *g,int c)
{
	FILE *f;
	f=fopen("test.txt","r");
	int i,j,k,w;
	if(f)
	{
		fscanf(f,"%d%d",&g->n,&g->e);
		for(i=0;i<g->n;i++)
		{
			fscanf(f,"%1s",&g->vexs[i]);
		}
		for(i=0;i<g->n;i++)
		{
			for(j=0;j<g->n;j++)
			{
				if(i==j)	g->edges[i][j]=0;
				else g->edges[i][j]=FINITY;
			}
		}
		for(k=0;k<g->e;k++)
		{
			fscanf(f,"%d%d%d",&i,&j,&w);
			g->edges[i][j]=w;
			if(c==0)
			{
				g->edges[j][i]=w;
			}
		}
		fclose(f);
	}
	else
	{
		g->n=0;
	}
}

void getedge(Mgraph g,edge edges[])
{
	int i,j,k=0;
	for(i=0;i<g.n;i++)
	{
		for(j=0;j<i;j++)
		{
			if(g.edges[i][j]!=0 && g.edges[i][j]<FINITY)
			{
				edges[k].begin=i;
				edges[k].end=j;
				edges[k++].length=g.edges[i][j];

			}
		}
	}
}

void quicksort(edge edges[],int left ,int right)
{
	edge x;
	int i,j,flag=1;
	if(left<right)
	{
		i=left;j=right;x=edges[i];
		while(i!=j)
		{
			while(i<j && x.length<edges[j].length)	j--;//找比x.length小的边
			if(i<j)
			{
				edges[i]=edges[j];i++;
			}
			while(i<j && x.length>edges[i].length) i++;
			if(i<j)
			{
				edges[j]=edges[i];j--;
			}
		}
		edges[i]=x;
		quicksort(edges,left,i-1);
		quicksort(edges,i+1,right);
	}
}

void prim(Mgraph g,edge tree[])
{
	edge x;int w;
	int d,min,j,k,s,v;
	for(v=1;v<=g.n-1;v++)
	{
		tree[v-1].begin=0;
		tree[v-1].end=v;
		tree[v-1].length=g.edges[0][v];
	}
	for(k=0;k<=g.n-3;k++)
	{
		min=tree[k].length;
		s=k;
		for(j=k+1;j<=g.n-2;j++)
		{
			if(tree[j].length<min)
			{
				min=tree[j].length;
				s=j;
			}
		}
		v=tree[s].end;
		if(s!=k)
		{
			x=tree[s];tree[s]=tree[k];tree[k]=x;
		}
		for(j=k+1;j<=g.n-2;j++)
		{
			d=g.edges[v][tree[j].end];
			if(d<tree[j].length)
			{
				tree[j].length=d;
				tree[j].begin=v;
			}
		}
	}
	w=0;
	for(j=0;j<=g.n-2;j++)
	{
		printf("\n%c-%c %d\n",g.vexs[tree[j].begin],g.vexs[tree[j].end],tree[j].length);
		w+=tree[j].length;
	}
	printf("the root of it is %c\n",g.vexs[0]);
	printf("the minest w is %d\n",w);
}
 
void print(Mgraph *g)
{
	int i,j;
	printf("一共有%d个边,%d个点。\n",g->e,g->n);
	printf("各个元素信息:\n");
	for(i=0;i<g->n;i++)
	{
		printf("%c ",g->vexs[i]);
	} 
	printf("\n");
	printf("对应的邻接矩阵:\n");
	for(i=0;i<g->n;i++)
	{
		for(j=0;j<g->n;j++)
		{
			printf("%-5d",g->edges[i][j]);
		}
		printf("\n");
	}
}
 
int main ()
{
	edge tree[M];
	Mgraph g;
	printf("输入:\n"); 
	creat(&g,0);
	printf("\n");
	printf("输出:\n"); 
	print(&g);
	prim(g,tree);
	return 0;
}

【数据结构】最小生成树Prim算法   【数据结构】最小生成树Prim算法

相关文章:

  • 2021-12-09
  • 2021-06-29
  • 2021-06-06
  • 2021-12-22
  • 2021-08-27
  • 2021-09-19
猜你喜欢
  • 2021-04-28
  • 2022-12-23
  • 2021-08-06
  • 2022-12-23
  • 2022-12-23
  • 2021-10-20
  • 2021-04-22
相关资源
相似解决方案