[数据结构] 图的Kruskal算法实现

来源:互联网 发布:软件测试策略 编辑:程序博客网 时间:2024/05/16 17:24

<pre name="code" class="cpp">#include <iostream>using namespace std; #define MAX_V 100 //定义最大顶点个数#define INF 1000 //表示正无穷 typedef struct VertexType{    int number;//顶点标号};//顶点类型typedef struct MGraph//图的定义{    int matrix[MAX_V][MAX_V];//邻接矩阵    int weight[MAX_V][MAX_V];//存放权值     int v;//顶点数int e;//边数    VertexType vertax[MAX_V];//存放顶点信息};//图的邻接矩阵类型typedef struct Edge{int v1;int v2;int weight;};//边的存储类型 void CreateMGragh(MGraph *G){int i,j,m,weight;cout << "请输入顶点数和边数:" << endl;cin >> G->v >> G->e ;cout << "请输入顶点信息:" << endl;for (i=0;i<G->v;i++){    scanf("%d",&G->vertax[i].number);//输入顶点信息,建立顶点表}for (i=0;i<G->v;i++)//初始化邻接矩阵   for (j=0;j<G->v;j++)      {   G->matrix[i][j]=0;  G->weight[i][j]=INF;//让所有权值不存在       }    for(i=0;i<G->v;i++)//是结点自身指向自身权值为0   for(j=0;j<G->v;j++)    if(i==j)      G->weight[i][j]=0;cout << "输入每条边的首尾顶点序号及权值:" << endl;for (m=0;m<G->e;m++){cin >> i >> j >> weight;   // >> weight;G->matrix[i][j]=1;G->matrix[j][i]=1;G->weight[i][j]=weight;G->weight[j][i]=weight;}}void DisplayMGragh(MGraph *G)//输出邻接矩阵G{    int i,j;    for(i=0;i<G->v;i++)    {        for(j=0;j<G->v;j++)          printf("%5d",G->matrix[i][j]);        printf("\n");    }    cout << endl;}void DisplayMGragh_W(MGraph *G)//输出权值矩阵G{    int i,j;    for(i=0;i<G->v;i++)    {        for(j=0;j<G->v;j++)          printf("%5d",G->weight[i][j]);        printf("\n");    }    cout << endl;}void Sort(Edge EdgeCount[], MGraph *G) // 给边进行升序排序 {int i,j;Edge temp;for(i = 0; i < G->v; i++){for(j = i; j <= G->v; j++){if(EdgeCount[j].weight < EdgeCount[i].weight){temp.v1 = EdgeCount[i].v1;temp.v2 = EdgeCount[i].v2;temp.weight = EdgeCount[i].weight;EdgeCount[i].v1 = EdgeCount[j].v1;EdgeCount[i].v2 = EdgeCount[j].v2;EdgeCount[i].weight = EdgeCount[j].weight;EdgeCount[j].v1 = temp.v1;EdgeCount[j].v2 = temp.v2;EdgeCount[j].weight = temp.weight;}}}}void Kruskal(MGraph *G) {Edge EdgeCount[10];//记录边数 int vset[MAX_V];int k = 0;int m = G->v;int i,j,s1,s2;   for(i = 0; i < G->v; i++){  for(j = 0; j < G->v; j++)  {    if(G->matrix[i][j] != 0)//如果两条边是连通的     {      if(i < j)  {      EdgeCount[k].v1 = i;  EdgeCount[k].v2 = j;  EdgeCount[k].weight = G->weight[i][j];  k++;   }    }  }}Sort(EdgeCount, G);    for (i=0;i<G->v;i++)//初始化辅助数组       {          vset[i]=i;      }          i = 0;    while(m > 1)//最小生成树边数为顶点数-1 {s1 = vset[EdgeCount[i].v1];s2 = vset[EdgeCount[i].v2];if(s1 != s2){cout << EdgeCount[i].v1 << "--" << EdgeCount[i].v2 << endl;m--;for(j = 0; j < G->v; j++)//改变连通分量的根节点 {if(vset[j] == s2)  vset[j] = s1;}}i++;}}int main(){MGraph *M;M = new MGraph;CreateMGragh(M);DisplayMGragh(M);DisplayMGragh_W(M);        Kruskal(M);return 0;} 



0 0
原创粉丝点击