7-3 畅通工程之最低成本建设问题 (30 分)

本文探讨了如何使用Prim算法解决‘畅通工程’中的最低成本建设问题。给定城镇数目N和候选道路数目M,通过输入的城镇道路统计表,计算出使所有城镇间都能通过快速路相互到达的最低总成本。对于无法确保畅通的输入数据,输出'Impossible'。示例展示了算法的具体应用和输出结果。
摘要由CSDN通过智能技术生成

某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了有可能建设成快速路的若干条道路的成本,求畅通工程需要的最低成本。

输入格式: 输入的第一行给出城镇数目N
(1<N≤1000)和候选道路数目M≤3N;随后的M行,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号(从1编号到N)以及该道路改建的预算成本。

输出格式: 输出畅通工程需要的最低成本。如果输入数据不足以保证畅通,则输出“Impossible”。

  • 输入样例1:
  • 6 15
  • 1 2 5
  • 1 3 3
  • 1 4 7
  • 1 5 4
  • 1 6 2
  • 2 3 4
  • 2 4 6
  • 2 5 2
  • 2 6 6
  • 3 4 6
  • 3 5 1
  • 3 6 1
  • 4 5 10
  • 4 6 8
  • 5 6 3
  • `输出样例1:
  • 12
  • 输入样例2:
  • 5 4
  • 1 2 1
  • 2 3 2
  • 3 1 3
  • 4 5 4
  • 输出样例2:
  • Impossible
//需要注意的就是开辟的二维数组的大小切忌用静态数组那样数组的长度是远远不够的!!!
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<iostream>
#define OK 1
#define ERROR -1
#define MVNUM 1001
typedef int InfoType;
typedef int VRType;
typedef int VertexType;
typedef int Status;
typedef enum{DG, DN, UDG, UDN} GraphKind;
typedef struct ArcType{
    int adj;
}ArcType;
typedef struct{
     VertexType vexs[MVNUM];
     int **arcs;
     int vexnum,arcnum;
     GraphKind kind;
}MGraph;
typedef struct close{
    VertexType adjvex;
    VRType lowcost;
}close;
close closeedge[MVNUM];
Status LocateVex(MGraph G,VertexType vex){
    int i;
    for(i=0;i<G.vexnum;++i){
    if(G.vexs[i]==vex)
        return i;
    }
    return ERROR;
}
Status CreateUDN(MGraph &G){
    int i,j,v1,v2,k,w;
    scanf("%d%d",&G.vexnum,&G.arcnum);
    for(i=0;i<G.vexnum;++i){
        G.vexs[i]=i+1;
    }
    for(i=0;i<G.vexnum;++i)
    for(j=0;j<G.vexnum;++j){
    G.arcs[i][j]=10000;
    }
    for(k=0;k<G.arcnum;++k){
    scanf("%d%d%d",&v1,&v2,&w);
    i=LocateVex(G,v1);
    j=LocateVex(G,v2);
    G.arcs[i][j] = w;
    G.arcs[j][i]= G.arcs[i][j];
    }
}
Status minimum(close *p,MGraph G){
    int i,j=0,min,a[1000],b[1000];
    for(i=0;i<G.vexnum;++i){
    if(p[i].lowcost!=0){
    a[j]=p[i].lowcost;
    b[j]=i;
    j++;}
    }
    min=0;
    for(i=1;i<j;++i){
        if(a[i]<a[min])min=i;
    }
    min=b[min];
    return min;
}
void MiniSpanTree_P(MGraph &G,VertexType u){
    int i,j,k,sum=0;
    k=LocateVex(G,u);
    for(j=0;j<G.vexnum;++j){
    if(j!=k){
    closeedge[j].adjvex=u;
    closeedge[j].lowcost=G.arcs[k][j];
    }
    }
     closeedge[k].lowcost = 0;
    for(i=1;i<=G.vexnum-1;++i){
    k=minimum(closeedge,G);
    if(closeedge[k].lowcost==10000)break;
    sum+=closeedge[k].lowcost;
    closeedge[k].lowcost = 0;
    for (j=0; j<G.vexnum; ++j)
    if (G.arcs[k][j] < closeedge[j].lowcost){
    closeedge[j].adjvex=G.vexs[k];
    closeedge[j].lowcost=G.arcs[k][j];
    }
    }
    if(closeedge[k].lowcost==10000)printf("Impossible");
    else
    printf("%d",sum);

}
int main()
{
    int i;
    MGraph G;
    G.arcs=(int**)malloc(sizeof(int*)*MVNUM);  
    for(i=0;i<MVNUM;i++)  
    G.arcs[i]=(int*)malloc(sizeof(int)*MVNUM);
    CreateUDN(G);
    MiniSpanTree_P(G,1);
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值