HDOJ1301 Jungle Roads----Prim
阿新 • • 發佈:2018-12-12
題意:給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; }