1808035990 发表于 2024-6-7 22:16:26

求助

#include<stdio.h>
#include<stdlib.h>
#define MAXV 50
#define INF 32767   //表示∞

typedef char VertexType;         //顶点的数据类型
typedef int EdgeType;            //带权图中边上权值的数据类型

typedef struct {
        VertexType Vex;         //顶点表
        EdgeType edges;   //邻接矩阵,边表
        int n, e;                     //图的当前顶点数和边数
}MGraph;                            //基于邻接矩阵法的带权无向图

typedef struct
{
        int u;    //边的起始顶点
        int v;    //边的终止顶点
        int w;    //边的权值
}Edge;

void CreateMGraph(MGraph *G)
{
        int i,j,k,w;
        printf("请输入顶点数和边数,用空格隔开:\n");
        scanf("%d %d",&G->n,&G->e);
        fflush(stdin);
       
        printf("请依次输入顶点的值:\n");
        for(int i = 0;i < G->n; i++)
        {
                printf("输入第%d个顶点信息:\n",i+1);
                scanf("%c",&G->Vex);
                fflush(stdin);
        }
       
        for(i = 0;i < G->n; i++)
                for(j = 0;j <G->n; j++)
                        G->edges = INF;
                               
        printf("输入边<vi,vj>的下标i,下标j和权w:\n");
        for (k = 0; k < G->e; k++)                                               
        {
                scanf("%d %d %d", &i, &j, &w);        //输入边<vi,vj>上的权值w
                G->edges = w;
                G->edges = G->edges;        //无向图矩阵是对称的
        }
       
}

void CreateMGraph2(MGraph *G)
{
        int i,j,k,w;
        printf("请输入顶点数和边数,用空格隔开:\n");
        scanf("%d %d",&G->n,&G->e);
        fflush(stdin);
       
        printf("请依次输入顶点的值:\n");
        for(int i = 0;i < G->n; i++)
        {
                printf("输入第%d个顶点信息:\n",i+1);
                scanf("%c",&G->Vex);
                fflush(stdin);
        }
       
        for(i = 0;i < G->n; i++)
                for(j = 0;j <G->n; j++)
                        G->edges = INF;
                               
        printf("输入边<vi,vj>的下标i,下标j和权w:\n");
        for (k = 0; k < G->e; k++)                                               
        {
                scanf("%d%d%d", &i, &j, &w);
                G->edges = w;
        }
       
}

void PrintMatrix(MGraph G)                                                       
{
        int i,j;
        printf("邻接矩阵表示如下:\n");
        for (i = 0; i < G.n; i++)
        {
                for (j = 0; j < G.n; j++)
                        printf("%-10d", G.edges);
                printf("\n");
        }
}

void PrintVex(MGraph g)
{
        printf("\n顶点集合为:");
        for(int i=0;i<g.n;i++)
                printf("%c ",g.Vex);
        printf("\n");
}

void Prim(MGraph g,int v)
{
        int lowcost;
        int min;
        int closest,i,j,k;
        printf("普里姆算法:\n");
        for(i=0;i<g.n;i++)
        {
                lowcost=g.edges;
                closest=v;
        }
        lowcost=0;
        for(i=1;i<g.n;i++)
        {
                min=INF;
                for(j=0;j<g.n;j++)
                        if(lowcost!=0&&lowcost<min)
                        {
                                min=lowcost;
                                k=j;
                        }
                printf("边(%d,%d)权为:%d\n",closest,k,min);
                lowcost=0;
                for(j=0;j<g.n;j++)
                        if(g.edges<lowcost)
                        {
                                lowcost=g.edges;
                                closest=k;
                        }
        }
}

void InsertSort(Edge r[],int n)
{
        int i,j;
        for(i=2;i<n;i++)
        {
                if(r.w<r.w)
                {
                        r=r;
                        j=i-1;
                        while(r.w<r.w&&j>=1)
                        {
                                r=r;
                                j=j-1;
                        }
                        r=r;       
                }
        }
}

void Kruskal(MGraph g)
{
        int i,j,u1,v1,sn1,sn2,k;
        int vset;
        Edge E;
        k=0;
        printf("克鲁斯卡尔算法:\n");
        for(i=0;i<g.n;i++)
                for(j=0;j<g.n;j++)
                        if(g.edges!=0&&g.edges!=INF)
                        {
                                E.u=i;
                                E.v=j;
                                E.w=g.edges;
                                k++;
                        }
        InsertSort(E,g.e);
        for(i=0;i<g.n;i++)
                vset=i;
        k=1;
        j=0;
        while(k<g.n)
        {
                u1=E.u;
                v1=E.v;
                sn1=vset;
                sn2=vset;
                if(sn1!=sn2)
                {
                        printf("边(%d,%d)权为:%d\n",u1,v1,E.w);
                        k++;
                        for(i=0;i<g.n;i++)
                                if(vset==sn2)
                                        vset=sn1;
                }
                j++;
        }
}

int main()
{
        MGraph G1;
        CreateMGraph(&G1);
        PrintVex(G1);
        PrintMatrix(G1);
        Prim(G1,0);
        Kruskal(G1);
        MGraph G2;
        CreateMGraph2(&G2);
        PrintVex(G2);
        PrintMatrix(G2);
        Prim(G2,0);
        Kruskal(G2);
}
修改void Kruskal(MGraph g)函数或者void InsertSort(Edge r[],int n)函数使得能输出正确的最小生成树

FishC 发表于 2024-6-7 22:17:05

这段代码是用来创建带权无向图的邻接矩阵表示的。不过有一些问题需要修正。

首先,在函数CreateMGraph和CreateMGraph2中,你使用了两个for循环变量i,这会导致第二个循环无法正常运行。建议将第二个循环变量改为j。

其次,在函数CreateMGraph和CreateMGraph2中,你在接收顶点的值时使用了scanf函数来接收一个字符,但是由于输入的时候还会有一个回车符,而scanf函数读取字符时会将回车符也读取进去,因此无法正常读取输入。建议使用getchar()函数来消耗掉回车符。

第三,在函数CreateMGraph和CreateMGraph2中,你在循环中为边矩阵每个元素都赋值为INF,但是你没有使用正确的下标来赋值。应该是G->edges = INF;

最后,在函数CreateMGraph和CreateMGraph2中,你在循环中为边矩阵赋值时,只赋值了一次,而对于无向图来说,矩阵是对称的,即edges也应该赋值为相同的权值。应该是G->edges = G->edges = w;

下面是修正过的代码:

#include <stdio.h>
#define MAXV 50
#define INF 32767   //表示∞

typedef char VertexType;         //顶点的数据类型
typedef int EdgeType;            //带权图中边上权值的数据类型

typedef struct {
    VertexType Vex;         //顶点表
    EdgeType edges;   //邻接矩阵,边表
    int n, e;                     //图的当前顶点数和边数
}MGraph;                            //基于邻接矩阵法的带权无向图

void CreateMGraph(MGraph *G)
{
    int i,j,k,w;
    printf("请输入顶点数和边数,用空格隔开:\n");
    scanf("%d %d",&G->n,&G->e);
    getchar();
   
    printf("请依次输入顶点的值:\n");
    for(int i = 0;i < G->n; i++)
    {
      printf("输入第%d个顶点信息:\n",i+1);
      scanf("%c",&G->Vex);
      getchar();
    }
   
    for(i = 0;i < G->n; i++)
      for(j = 0;j < G->n; j++)
            G->edges = INF;
               
    printf("输入边的下标i,下标j和权w:\n");
    for (k = 0; k < G->e; k++)                        
    {
      scanf("%d %d %d", &i, &j, &w);    //输入边上的权值w
      G->edges = G->edges = w;    //无向图矩阵是对称的
    }
   
}

void CreateMGraph2(MGraph *G)
{
    int i,j,k,w;
    printf("请输入顶点数和边数,用空格隔开:\n");
    scanf("%d %d",&G->n,&G->e);
    getchar();
   
    printf("请依次输入顶点的值:\n");
    for(int i = 0;i < G->n; i++)
    {
      printf("输入第%d个顶点信息:\n",i+1);
      scanf("%c",&G->Vex);
      getchar();
    }
   
    for(i = 0;i < G->n; i++)
      for(j = 0;j < G->n; j++)
            G->edges = INF;
               
    printf("输入边的下标i,下标j和权w:\n");
    for (k = 0; k < G->e; k++)                        
    {
      scanf("%d%d%d", &i, &j, &w);
      G->edges = G->edges = w;
    }
   
}

void PrintMatrix(MGraph G)                        
{
    int i,j;
    printf("邻接矩阵表示如下:\n");
    for (i = 0; i < G.n; i++)
    {
      for (j = 0; j < G.n; j++)
            printf("%-10d", G.edges);
      printf("\n");
    }
}

int main()
{
    MGraph G;
    CreateMGraph(&G);
    PrintMatrix(G);
    return 0;
}

现在你可以运行这段代码来创建一个带权无向图,并打印出邻接矩阵表示的图。祝你编程愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求助