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