1. 程式人生 > >HDOJ1301 Jungle Roads----Prim

HDOJ1301 Jungle Roads----Prim

題意:給N個村莊,然後n-1行輸入,每行是村莊編號、與它連線的村莊數,然後是每個與它連線的村莊的距離。

求最小生成樹。

Prim:貪心思想,假設在某步已經找到了最小生成樹的一部分G,dis記錄了其它每點到G中最短的距離,pre記錄最短距離對於的G中連線點,從所有dis中找出最短的,將其加入到G中,再更新dis和pre...

要注意的是scanf讀取字元,如果鍵盤輸入3換行(或者空格),

scanf("%d",&num);只會讀取3不會去掉換行符或空格符,需要getchar()去掉或者重新整理緩衝區。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define INF 0xffffff
using namespace std;
int Map[30][30];//圖
int pre[30];
int dis[30];//
int n;

int Prim() {
    int ret = 0;
    for(int i = 1; i <= n;i++) {
        pre[i] = 1;
        dis[i] = Map[i][1];
    }
    
    for(int i = 1;i < n;i++) {
        int Min = INF;
        int num;
        for(int j = 1;j <= n;j++) {
            if(dis[j] == 0)
                continue;
            if(dis[j] < Min) {
                Min = dis[j];
                num = j;
            }
        }
        
        if(Min == INF)
            break;
        ret += dis[num];
        dis[num] = 0;
        pre[num] = num;
        for(int j = 1;j <= n;j++) {
            if(dis[j] != 0 && dis[j] > Map[j][num])
                dis[j] = Map[j][num];
                pre[j] = num;
        }
        
    }
    return ret;
}

int main()
{
    while(scanf("%d",&n) != EOF && n != 0) {
        getchar();//取出換行符
        for(int i = 0;i < 30;i++)
            for(int j = 0;j < 30;j++) {
                Map[i][j] = INF;
                if(i == j)
                    Map[i][j] = Map[j][i] = 0;
            }
        char temp;
        int a;//輸入的點
        int num;//點個數
        for(int i = 1;i < n;i++) {
            scanf("%c",&temp);
            a = temp - 'A' + 1;
            int b;
            int length;
            scanf("%d",&num);
            getchar();
            for(int i = 0;i < num;i++) {
                scanf("%c",&temp);
                b = temp - 'A' + 1;
                scanf("%d",&length);
                getchar();
                Map[a][b] = Map[b][a] = length;
            }
        }
        printf("%d\n",Prim());
        
    }
   
   
   
    return 0; 
}