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


    题目:

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

      1 #include "stdio.h"
      2 /*
      3 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标,
      4 使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快
      5 速路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路是否已经修通的状态。
      6 现请你编写程序,计算出全地区畅通需要的最低成本:
      7 输入格式:
      8 
      9 输入的第一行给出村庄数目NN(1le 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("实现全地区畅通需要的最低成本的道路有:
    ");
     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("
    最低成本为:%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 }
    努力的意义就是放眼望去以后都是喜欢的人和事......
  • 相关阅读:
    Java13新特性 -- 重新实现旧版套接字API
    Java13新特性 -- switch表达式动态CDS档案(动态类数据共享归档)
    Java13新特性 -- 文本块
    Java13新特性 -- switch表达式
    Java12新特性 -- 其他新增,移除,废弃项
    Java12新特性 -- 增强G1,自动返回未用堆内存给操作系统
    Java12新特性 -- 可中断的 G1 Mixed GC
    Java12新特性 -- 默认生成类数据共享(CDS)归档文件
    Java12新特性 -- 只保留一个 AArch64 实现
    python使用requests发送text/xml报文数据
  • 原文地址:https://www.cnblogs.com/Lorrained/p/13884315.html
Copyright © 2020-2023  润新知