//建立图的邻接矩阵储存结构
#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;
}