数据结构与算法课程设计---Prim算法

题目:

  某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标,
使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快
速路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路是否已经修通的状态。
现请你编写程序,计算出全地区畅通需要的最低成本:

  1 #include "stdio.h"
  2 /*
  3 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标,
  4 使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快
  5 速路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路是否已经修通的状态。
  6 现请你编写程序,计算出全地区畅通需要的最低成本:
  7 输入格式:
  8 
  9 输入的第一行给出村庄数目NN(1\le N \le 1001≤N≤100);随后的N(N-1)/2N(N?1)/2行对应村庄间道路的成本及修建状态:
 10 每行给出4个正整数,分别是两个村庄的编号(从1编号到NN),此两村庄间道路的成本,以及修建状态 — 1表示已建,0表示未建。
 11 输出格式:
 12 
 13 输出全省畅通需要的最低成本。
 14 输入样例:
 15 
 16 4
 17 1 2 1 1
 18 1 3 4 0
 19 1 4 1 1
 20 2 3 3 0
 21 2 4 2 1
 22 3 4 5 0
 23 输出样例:
 24 
 25 3
 26 */
 27 #define MAX 101
 28 #define INFINITY 10000  //表示极大值
 29 //prim算法从顶点入手
 30 struct Edge{
 31     int  adjvex;//U中 记录最小边在U中的那个顶点
 32     int lowcost;//U中 最小边的权值
 33 }closedge[MAX];//辅助数组,记录从U到V-U具有最小代价的边
 34 void MinSpanTree_Prime(int G[MAX][MAX] ,int n)
 35 {
 36     int sum=0;
 37     int i,j;
 38     //用prim算法从第1个顶点
 39     closedge[1].lowcost = -1;//将第1个顶点并入到U中
 40     for(j=2;j<=n;j++)
 41     {
 42         //对于V-U中的顶点j,初始化closedge[j]
 43          if(G[j][1]<closedge[j].lowcost)
 44          {
 45                 closedge[j].adjvex  = 1;
 46                 closedge[j].lowcost = G[j][1];
 47                 
 48          }
 49     }
 50     printf("实现全地区畅通需要的最低成本的道路有:\n");
 51     for(i=1;i<n;i++)
 52     {//共n-1轮,每轮找出最小边输出,赋-1更新
 53          int k = INFINITY;
 54          for( j=1;j<=n;j++)
 55          {
 56             if(closedge[j].lowcost!=-1)
 57             {
 58                 k = j;break;
 59             }
 60         }
 61         for( j=1;j<=n;j++)
 62         {//求U和V-U之间最小的权值在V-U中的顶点的位置
 63             if(closedge[j].lowcost!=-1)
 64                 if(closedge[j].lowcost<closedge[k].lowcost)
 65                     k = j;  
 66         }
 67         sum += closedge[k].lowcost;
 68         printf("(%d,%d)",closedge[k].adjvex,k);//输出最小边
 69         closedge[k].lowcost = -1;//将顶点k加入集合U中
 70         for( j=1;j<=n;j++)
 71         { //根据k结点更新数组元素代价
 72             if(G[j][k]<closedge[j].lowcost)
 73             {
 74                 closedge[j].adjvex  = k;
 75                 closedge[j].lowcost = G[j][k];
 76             }
 77         }
 78        
 79     }
 80     printf("\n最低成本为:%d",sum);
 81 }
 82 
 83 int main(){
 84     int n,m;
 85     int i,j;
 86     int G[MAX][MAX];
 87     //G先初始化为无穷
 88     for( i=1;i<MAX;i++)
 89     {
 90         for( j=1;j<MAX;j++)
 91         {
 92             G[i][j] = INFINITY;
 93         }
 94     }
 95     for( i=0;i<MAX;i++)
 96     {
 97         closedge[i].lowcost = INFINITY;
 98     }
 99     scanf("%d",&n);
100     m = n*(n-1)/2;
101     for( i=0;i<m;i++)
102     {
103         int t1,t2,t3,t4;
104         scanf("%d",&t1);
105         scanf("%d",&t2);
106         scanf("%d",&t3);
107         scanf("%d",&t4);
108         if(t4==1)
109             t3 = 0;
110         G[t1][t2] = t3;
111         G[t2][t1] = t3;
112     }
113     MinSpanTree_Prime(G,n);
114     return 0;
115 }

 

posted @ 2020-10-27 13:35  #Lorraine#  阅读(298)  评论(0编辑  收藏  举报