#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char VertexType;
typedef int EdgeTyep;
#define MAXVEX 100
#define INFINITY 65535
#define DEBUG
typedef struct Graph{
VertexType vexs[MAXVEX];
EdgeTyep arc[MAXVEX][MAXVEX];
int numVertexes, numEdges;
}Graph;
int Locates(Graph *g, char ch)
{
int i;
for(i = 0; i < g->numVertexes; i++)
{
if(g->vexs[i] == ch)
break;
}
if(i >= g->numVertexes)
return -1;
return i;
}
void CreatGraph(Graph *g)
{
int i, j, w, k;
printf("please input numVertexes and numEdges\n");
scanf("%d %d", &(g->numVertexes), &(g->numEdges));
getchar();
#ifdef DEBUG
printf("%d %d\n", g->numVertexes, g->numEdges);
#endif
for(i = 0; i < g->numVertexes; i++)
{
printf("请输入顶点%d:\n", i);
scanf("%c", &(g->vexs[i]));
getchar();
}
#ifdef DEBUG
for(i = 0; i < g->numVertexes; i++)
{
printf("%c ", g->vexs[i]);
}
printf("\n");
#endif
for(i = 0; i < g->numEdges; i++)
{
for(j = 0; j < g->numEdges; j++)
{
g->arc[i][j] = INFINITY;
}
}
for(k = 0; k < g->numEdges; k++)
{
char p, q;
printf("please input i, j, w in Edge(vi, vj)\n");
scanf("%c %c %d", &p, &q, &w);
getchar();
int m = -1;
int n = -1;
m = Locates(g, p);
n = Locates(g, q);
if(n == -1 || m == -1)
{
printf("There is no vertex !\n");
return ;
}
g->arc[m][n] = w;
g->arc[n][m] = g->arc[m][n];
}
}
void printGraph(Graph g)
{
int i, j;
printf("The Graph is under this sentence\n");
for(i = 0; i < g.numVertexes; i++)
{
for(j = 0; j < g.numVertexes; j++)
{
printf("%5d ", g.arc[i][j]);
}
printf("\n");
}
}
void MiniSpanTree_Prime(Graph g)
{
int mins, i, j, k;
int adjvex[MAXVEX];
int lowcost[MAXVEX];
lowcost[0] = 0;
adjvex[0] = 0;
for(i = 1; i < g.numVertexes; i++)
{
lowcost[i] = g.arc[0][i];
adjvex[i] = 0;
}
for(i = 1; i < g.numVertexes; i++)
{
mins = INFINITY;
j = 1;
k = 0;
while(j < g.numVertexes)
{
if(lowcost[j] != 0 && lowcost[j] < mins)
{
mins = lowcost[j];
k = j;
}
j++;
}
printf("(%d,%d)", adjvex[k], k);
lowcost[k] = 0;
for(j = 1; j < g.numVertexes; j++)
{
if(lowcost[j] != 0 && g.arc[k][j] < lowcost[j])
{
lowcost[j] = g.arc[k][j];
adjvex[j] = k;
}
}
}
printf("\n");
}
int main()
{
Graph g;
CreatGraph(&g);
printGraph(g);
MiniSpanTree_Prime(g);
return 0;
}