酒煮青梅392 2023-06-05 20:00 采纳率: 65.2%
浏览 28
已结题

关于#c语言#的问题:这是一个用快排和kruskal算法的求最小树的代码


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INF 10000
#define MAXV 6
#define MAXSIZE 10;
typrdef struct
{ 
 int no;//顶点编号 
 InFoType into;
}VertexType;

typedef struct
{
    int edge[MAXV][MAXV];
    int n,e;
    VertexType vexs[MAXV];
}MatGraph;


typedef struct
{
    int u;
    int v;
    int w;
}Edge;

typedef struct
{
    int key;
    int a;
    int b;
}ReeType;

int partition(RecType R[],int s,int t)
{
    int i=s,j=t;
    RecType base=R[i];
    while(i<j)
    {
        while(j>i&&R[i].key>=base.key)
        j--;
        if(i<j)
        {
            R[i]=R[j];
            i++;
        }
        while(j>i&&R[i].key<base.key)
        i++;
        if(i<j)
        {
            R[i]=R[j];
            j--;
        }
        
    }
    R[i]=base;
    return i;
    
}

void QuickSort(RecType R[],int s,int t)
{
    int i;
    if(s<t)
    {
        i=partition(R,s,t);
        QuickSort(R,s,i-1);
        QuickSort(R,i+1,t);
    }
}

void Kruskal(MatGraph g)
{
    int i,j,u1,v1,sn1,sn2,k;
    int vest[MAXV];
    Edge E[10];
    k=0;
    for(i=0;i<g.n;i++)
    {
        for(j=0;j<=i;j++)
        if(g.edge[i][j]!=0&&g.edge[i][j]!=INF)
        {
            E[k].u=i;
            E[k].v=j;
            E[k].w=g.edge[i][j];
            k++;
        }
    }
    
    QuickSort(E,u,v);
    for(i=0;i<g.n;i++)
    vest[i]-i;
    k=1;
    j=0;
    while(k=g.n)
    {
        u1=E[j].u;
        v1=E[j].v;
        sn1=vset[u1];
        sn2=vset[v1];
        if(sn1!=sn2)
        {
            printf("(%d,%d):%d\n",u1,v1,E[j],w);
            k++;
            for(i=0;i<g.n;i++)
            if(vset[i]==sn2)
            vset[i]=sn1;
            
        }
        
        j++;
        
    }
    
}

int main()
{
    MatGraph g;
    MatGraph.edge={{0,6,1,5,10000,10000},{6,0,3,10000,3,10000},{1,3,0,5,6,4},{5,10000,5,0,10000,2},{10000,3,6,10000,0,6},{10000,10000,4,2,6,0}};
    int n=5,e=10;
    MatGraph.vexs={1,2,3,4,5,6};
    
    Kruskal(g);
    
    
    
};

这是一个用快排和kruskal算法的求最小树的代码,帮忙修改一下

  • 写回答

2条回答 默认 最新

  • Leodong. 2023-06-05 21:04
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    这份代码中有一些语法和逻辑错误,我将对其进行修正。

    1. 在代码中的第4行,typrdef应该改为typedef

    2. 在代码中的第9行,InFoType没有定义,应该将其改为一个具体的数据类型,例如int

    3. 在代码中的第20行和第25行,ReeType应该改为RecType

    4. 在代码中的第30行,QuickSort函数的参数声明应该改为RecType R[],因为之前已经定义了RecType

    5. 在代码中的第43行,uv没有声明,应该改为int u, v

    6. 在代码中的第45行,vset没有声明,应该改为vest

    7. 在代码中的第53行,k=g.n应该改为k==g.n

    8. 在代码中的第54行,vset[u1]应该改为vest[u1]

    9. 在代码中的第55行,vset[v1]应该改为vest[v1]

    10. 在代码中的第68行,应该在main函数后加上一对大括号。

    下面是修正后的代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define INF 10000
    #define MAXV 6
    
    typedef struct {
        int no; // 顶点编号
        int info;
    } VertexType;
    
    typedef struct {
        int edge[MAXV][MAXV];
        int n, e;
        VertexType vexs[MAXV];
    } MatGraph;
    
    typedef struct {
        int u;
        int v;
        int w;
    } Edge;
    
    typedef struct {
        int key;
        int a;
        int b;
    } RecType;
    
    int partition(RecType R[], int s, int t) {
        int i = s, j = t;
        RecType base = R[i];
        while (i < j) {
            while (j > i && R[j].key >= base.key) j--;
            if (i < j) {
                R[i] = R[j];
                i++;
            }
            while (j > i && R[i].key < base.key) i++;
            if (i < j) {
                R[j] = R[i];
                j--;
            }
        }
        R[i] = base;
        return i;
    }
    
    void QuickSort(RecType R[], int s, int t) {
        int i;
        if (s < t) {
            i = partition(R, s, t);
            QuickSort(R, s, i - 1);
            QuickSort(R, i + 1, t);
        }
    }
    
    void Kruskal(MatGraph g) {
        int i, j, u, v, sn1, sn2, k;
        int vest[MAXV];
        Edge E[10];
        k = 0;
        for (i = 0; i < g.n; i++) {
            for (j = 0; j <= i; j++) {
                if (g.edge[i][j] != 0 && g.edge[i][j] != INF) {
                    E[k].u = i;
                    E[k].v = j;
                    E[k].w = g.edge[i][j];
                    k++;
                }
            }
        }
    
        QuickSort(E, 0, k - 1);
        for (i = 0; i < g.n; i++)
            vest[i] = i;
        k = 1;
        j = 0;
        while (k < g.n) {
            u = E[j].u;
            v = E[j].v;
            sn1 = vest[u];
            sn2 = vest[v];
            if (sn1 != sn2) {
                printf("(%d,%d):%d\n", u, v, E[j].w);
                k++;
                for (i = 0; i < g.n; i++)
                    if (vest[i] == sn2) vest[i] = sn1;
            }
            j++;
        }
    }
    
    int main() {
        MatGraph g;
        g.edge[0][0] = 0; g.edge[0][1] = 6; g.edge[0][2] = 1; g.edge[0][3] = 5; g.edge[0][4] = INF; g.edge[0][5] = INF;
        g.edge[1][0] = 6; g.edge[1][1] =0; g.edge[1][2] = 3; g.edge[1][3] = INF; g.edge[1][4] = 3; g.edge[1][5] = INF;
        g.edge[2][0] = 1; g.edge[2][1] = 3; g.edge[2][2] = 0; g.edge[2][3] = 5; g.edge[2][4] = 6; g.edge[2][5] = 4;
        g.edge[3][0] = 5; g.edge[3][1] = INF; g.edge[3][2] = 5; g.edge[3][3] = 0; g.edge[3][4] = INF; g.edge[3][5] = 2;
        g.edge[4][0] = INF; g.edge[4][1] = 3; g.edge[4][2] = 6; g.edge[4][3] = INF; g.edge[4][4] = 0; g.edge[4][5] = 6;
        g.edge[5][0] = INF; g.edge[5][1] = INF; g.edge[5][2] = 4; g.edge[5][3] = 2; g.edge[5][4] = 6; g.edge[5][5] = 0;
        g.n = 6;
        g.vexs[0].no = 1; g.vexs[1].no = 2; g.vexs[2].no = 3; g.vexs[3].no = 4; g.vexs[4].no = 5; g.vexs[5].no = 6;
    
        Kruskal(g);
    
        return 0;
    }
    

    这份代码修正后应该可以正确执行了。需要注意的是,输入的图是一个无向连通图,其邻接矩阵的对称性需要保证。此外,图中的边权值应该是非负整数,因为快排算法的实现中使用了等于号。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月13日
  • 已采纳回答 6月5日
  • 创建了问题 6月5日

悬赏问题

  • ¥20 求下下面这个数据结构代码
  • ¥15 路由器考试怎么办,有懂行的吗 ,eNSP
  • ¥20 前端 二进制文件流图片转化异常
  • ¥15 github上的这个C语言项目如何跑起来
  • ¥15 java 判断某个数 区间是否存在
  • ¥15 appium控制多个雷电模拟器问题
  • ¥15 C# iMobileDevice
  • ¥15 谁会做这个啊#ensp#Boson NetSim
  • ¥15 如何编写针对TPS6503320FRGE型号的电源管理芯片的编程代码?
  • ¥15 设计简单目录管理系统,要满足以下内容