08-图7 公路村村通 (30 分)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入格式:
输入数据包括城镇数目正整数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
代码
使用的是Kruskal算法,原因是为了锻炼一下自己,顺便重新写一下最小堆还有复习一下相关的数据结构。测试结果出现了段错误,不明所以,我自己使用了浙大数据结构实验书上面的数据进行了测试,没有发现问题,不知道是用什么数据进行测试的
#include <iostream>
#define MaxSize 1001
using namespace std;
typedef int Vertex;
typedef int ElementType;
/*图的邻接表定义*/
typedef struct ListNode* List;
typedef struct ENode* Edge;
struct ENode {
Vertex v1;
Vertex v2;
ElementType Weight;
};
struct ListNode {
Vertex V;
ElementType Weight;
List Next;
ListNode():Next(NULL){}
};
typedef List PtrToNode;
typedef struct VNode{
PtrToNode FirstEdge;
}PtrArray[MaxSize];
typedef struct GraphNode* Graph;
struct GraphNode {
int Nv;
int Ne;
PtrArray heads;
};
Graph CreatGraph(int N) {
Graph G = new GraphNode;
G->Nv = N;
G->Ne = 0;
for (int i = 0; i <= N; i++) {
G->heads[i].FirstEdge = NULL;
}
return G;
}
void InsertEdge(Graph G) {
Vertex v1, v2;
ElementType Weight;
cin >> v1 >> v2 >> Weight;
List tmp = new ListNode;
tmp->Next = G->heads[v1].FirstEdge;
tmp->V = v2;
tmp->Weight = Weight;
G->heads[v1].FirstEdge = tmp;
tmp = new ListNode;
tmp->Next = G->heads