poj 1789 prim

这题是prim的水题。。。

注意:

1.读懂题,读了好半天,明白是啥意思

2.注意数据范围,map[2001][2001]必须放在堆里面。。。否则RUNTIME error

代码:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define MAX 8
#define MAX_SIZE_OF_VEXS 2001
using namespace std;
typedef struct
{
        int vexs[MAX_SIZE_OF_VEXS];
        int arcs[MAX_SIZE_OF_VEXS][MAX_SIZE_OF_VEXS];
        int vex_num;
        int arc_num;
}graph;
typedef struct
{
        int lowcast;
        int adjvex;
}cl;
char* s[2001];
graph g;
cl close[MAX_SIZE_OF_VEXS];

int prim(int u)
{
     int sum = 0;
     for(int i = 1;i <= g.vex_num; i++)
     {
             close[i].adjvex = u;
             close[i].lowcast = g.arcs[i][u];
     }
     for(int q = 1;q <= g.vex_num-1; q++)
     {
             int min = MAX,k;
             for(int j = 1;j <= g.vex_num;j++)
             {
                 if(close[j].lowcast>0 && min > close[j].lowcast)
                 {
                        k = j;
                        min = close[j].lowcast;
                 }
             }
             close[k].lowcast = 0;
            sum += g.arcs[(close[k].adjvex)][k];
             for(int j = 1; j <= g.vex_num; j++)
             {
                 if(close[j].lowcast > g.arcs[j][k])
                 {
                     close[j].lowcast = g.arcs[j][k];
                     close[j].adjvex = k;
                 }
             }
     }
     return sum;
}
int comp(char* s,char* r)
{
    int sum = 0;
    for(int i = 0;i <= 6;i++)
    {
            if(s[i] != r[i])  sum++;
    }
    return sum;
}
int main()
{
     while(cin>>g.vex_num && g.vex_num)
     {
            for(int i = 1;i <= g.vex_num;i++)
            {
                    s[i] = (char*)malloc(sizeof(char)*10);
                    cin>>s[i];
            }
            for(int i = 1;i <= g.vex_num; i++)
                    for(int j = i;j <= g.vex_num; j++)
                         g.arcs[i][j] = g.arcs[j][i] = (i == j)?0:comp(s[i],s[j]);
            cout<<"The highest possible quality is 1/"<<prim(1)<<".\n";        
     }
     return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值