PTA 数据结构 公路村村通

7-11 公路村村通 (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
#include 
#include 
#include 
#define maxn 3010
#define INFINITY 0x3f3f3f3f

typedef struct Node
{
    int villageA;
    int villageB;
    int price;
}Node;
Node road[maxn];
bool roadVisited[maxn] = {false};  //边是否被访问过

/*并查集*/
int parent[maxn];
int rank[maxn];

//初始化n个节点
void Init(int n)
{
    for(int i = 1; i <= n; i++)
    {
        parent[i] = i;
        rank[i] = 0;
    }
}
//查找当前元素所在树的根节点
int find(int x)
{
    if(x == parent[x])
        return x;
    return parent[x] = find(parent[x]); //在第一次查找时,将节点直连到根节点
}
//合并元素x, y所处的集合
void Unite(int x, int y)
{
    //查找到x,y的根节点
    x = find(x);
    y = find(y);
    if(x == y) 
        return ;
    //判断两棵树的高度,然后在决定谁为子树
    if(rank[x] < rank[y])
    {
        parent[x] = y;
    }
    else
    {
        parent[y] = x;
        if(rank[x] == rank[y]) 
        rank[x]++;
    }
}
//判断x,y是属于同一个集合
bool same(int x, int y)
{
    return find(x) == find(y);
}
int FindIndexOfMin(int n)
{
    int min = INFINITY;
    int indexofmin = -1;
    for(int i=0;i> n >> m;
    Init(n);
    for(int i=0;i> road[i].villageA >> road[i].villageB >> road[i].price;
    }
    Kruskal(n,m);
    return 0;
}

 

你可能感兴趣的:(数据结构,kruskal)