鱼C论坛

 找回密码
 立即注册
查看: 3716|回复: 1

关于最小生成树,普里姆算法

[复制链接]
发表于 2017-2-7 17:45:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 gascd 于 2017-2-7 17:49 编辑

代码为hdu1102的错误答案
原题目:http://acm.hdu.edu.cn/showproblem.php?pid=1102

题目大意为, 有N(3<=N<=100)个村庄,需要给村庄之间修路。
每个村庄之间的距离范围是[1,1000],其中已经修好了Q(0 <= Q <= N * (N + 1) / 2)条路。
输入:第一行输入整数N,在接下来N行输入矩阵。再输入整数Q,在接下来Q行,每行输入2个整数,代表两个村庄已经有修好的路。
输出:你需要修建的路的长度。
样例输入:
3
0 990 692
990 0 179
692 179 0
1
1 2
样例输出:
179
我的代码样例过了,自己又举了两个例子,也过了,但提交的时候,却显示错误答案,找了半天也没发现错误,求各路大神帮忙看看。
#include <stdio.h>
#include <stdlib.h>

#define INFINITY 65535
#define MAXVEX 100

typedef struct
{
        char vexs[MAXVEX];
        int arc[MAXVEX][MAXVEX];
        int numVertexes, numEdges;
}MGraph;
long long num = 0;

void CreateMGraph(MGraph *G)
{
        int i, j, q, m, n;

        scanf("%d", &G->numVertexes);
        for(i=0; i<G->numVertexes; i++)
        {
                for(j=0; j<G->numVertexes; j++)
                {
                        getchar();
                        scanf("%d", &G->arc[i][j]);
                }
        }
        scanf("%d\n", &q);
        for(i=0; i<q; i++)
        {
                scanf("%d %d", &m, &n);
                G->arc[m-1][n-1] = 1;
                G->arc[n-1][m-1] = 1;
                num--;
        }
}

void prim(MGraph *G)
{
        int lowcost[MAXVEX];
        int min, i, j, k;

        for(i=0; i<G->numVertexes; i++)
        {
                lowcost[i] = G->arc[0][i];
        }

        //实现过程
        for(i=0; i<G->numVertexes; i++)
        {
                min = INFINITY;
                j = 1;
                k = 0;
                while(j<G->numVertexes)
                {
                        if(lowcost[j] != 0 && lowcost[j] < min)
                        {
                                min = lowcost[j];
                                k = j;
                        }
                        j++;
                }
                if(min != INFINITY)
                        num += min;
                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];
                        }
                }
        }
        printf("%d", num);
}

int main()
{
        MGraph G;
        CreateMGraph(&G);
        prim(&G);
        system("pause");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-7 17:52:26 | 显示全部楼层
贪心只能过样例
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-2 19:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表