poj 1789 prim

来源:互联网 发布:2017年服装行业数据 编辑:程序博客网 时间:2024/04/29 06:12

这题是prim的水题。。。

注意:

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

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

代码:

#include<stdio.h>#include<stdlib.h>#include<iostream>#define MAX 8#define MAX_SIZE_OF_VEXS 2001using 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;}