现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入格式:
输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。
输出格式:
输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−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
输出样例:
12
#include<stdio.h>
#include<stdlib.h>
#define Vertex int
#define WeightType int
#define MaxSize 1000
#define INFINITY 65535
typedef struct ENode *PtrToEdge;
struct ENode{
Vertex V1;
Vertex V2;
WeightType Weight;
};
typedef struct GNode *MGraph;
struct GNode{
int Nv;
int Ne;
WeightType G[MaxSize][MaxSize];
};
MGraph BuiltG();
MGraph CreatG(int N,int M);
void InsertEdge(MGraph G,Vertex V1,Vertex V2,WeightType W);
int Prim(MGraph G);
Vertex FindMinDist(MGraph G,WeightType Dist[]);
int main()
{
MGraph G;
int cost;
G=BuiltG();
cost=Prim(G);
printf("%d\n",cost);
return 0;
}
MGraph BuiltG()
{
MGraph G;
int N,M;
Vertex V,W;
int i;
PtrToEdge E=(PtrToEdge)malloc(sizeof(struct ENode));
scanf("%d %d",&N,&M);
G=CreatG(N,M);
for(i=0;i<M;i++)
{
scanf("%d %d %d",&E->V1,&E->V2,&E->Weight);
E->V1--;
E->V2--;
InsertEdge(G,E->V1,E->V2,E->Weight);
}
return G;
}
MGraph CreatG(int N,int M)
{
Vertex V,W;
MGraph G=(MGraph)malloc(sizeof(struct GNode));
G->Nv=N;
G->Ne=M;
for(V=0;V<N;V++)
for(W=0;W<N;W++)
G->G[V][W]=INFINITY;
return G;
}
void InsertEdge(MGraph G,Vertex V1,Vertex V2,WeightType W)
{
G->G[V1][V2]=W;
G->G[V2][V1]=W;
}
int Prim(MGraph G)
{
WeightType Dist[MaxSize],TotalWeight;
Vertex parent[MaxSize],V,W;
int VCount;
TotalWeight=0;
VCount=0;
for(V=0;V<G->Nv;V++)// 将初始点0收录进结果树
{
Dist[V]=G->G[0][V];
parent[V]=0;
}
Dist[0]=0;
parent[0]=-1;
VCount++;
while(1)
{
V=FindMinDist(G,Dist);
if(V==-1)
break;
TotalWeight+=Dist[V];
VCount++;
printf("%d %d %d\n",V+1,parent[V]+1,Dist[V]);
Dist[V]=0;
for(W=0;W<G->Nv;W++)
{
if(Dist[W]!=0&&G->G[V][W]<Dist[W])
{
Dist[W]=G->G[V][W];
parent[W]=V;
}
}
}
if(VCount<G->Nv )
TotalWeight=-1;
return TotalWeight;
}
Vertex FindMinDist(MGraph G,WeightType Dist[])
{
Vertex MinV,V;
WeightType MinDist=INFINITY;
for(V=0;V<G->Nv;V++)
{
if(Dist[V]!=0&&Dist[V]<MinDist)
{
MinDist=Dist[V];
MinV=V;
}
}
if(MinDist<INFINITY)
return MinV;
else
return -1;
}