POJ 1251题

it2022-05-08  10

//最小生成树:Prim#include <stdio.h>#include <string.h>#define arraysize 28int dis[arraysize][arraysize];bool final[arraysize];int d[arraysize];int n;int maxData = 0x7fffffff;void Prim(){ int i; int j; int v; int min; int sum = 0; memset(final,0,sizeof(final)); for(i=1;i<n+1;++i) {  d[i] = dis[1][i]; } final[1] = true; d[1] = 0; v =1; for(i=1;i<n;++i) {  min = maxData;  for(j=1;j<n+1;++j)  {   if(!final[j] && min>d[j] && d[j]<maxData) //别忘了判断是否小于最大值    {    v = j;    min = d[j];   }  }  sum += min;  final[v] = true;  for(j=1;j<n+1;++j)  {   if(!final[j] && d[j]>dis[v][j] && dis[v][j]<maxData) //别忘了判断是否小于最大值    d[j] = dis[v][j];  } } printf("%d\n",sum);}int main(){ //freopen("1.txt","r",stdin); int k; int cost; int i,j; char start[10],end[10]; while(scanf("%d",&n)!=EOF) {    if(n==0)   break;  //初始化临界矩阵  for(i=1;i<n+1;++i)  {   for(j=1;j<n+1;++j)    dis[i][j] = maxData;  }  for(i=1;i<n;++i)  {   //不要使用字符,直接读取字符串   scanf("%s%d",&start,&k);   for(j=1;j<k+1;j++)   {    scanf("%s%d",&end,&cost);    //将字符转换成数字,A的ASCII码65,双向的    dis[start[0]-64][end[0]-64] = cost;    dis[end[0]-64][start[0]-64] = cost;   }  }  Prim(); } return 0;}

转载于:https://www.cnblogs.com/north_dragon/archive/2010/04/30/1725376.html

相关资源:数据结构—成绩单生成器

最新回复(0)