公路村村通(30)

用了Kruskal算法来生成最小生成树

当然也可以用Prim算法来做

#include <iostream>
using namespace std;
typedef struct{
    int start;
    int end;
    int length;
}road;

int* father;
road* map;
int n, m;
int countRoad = 0, sum = 0;

int roadCompare(const void* a, const void* b);
int findFather(int i);
int main()
{
    cin >> n >> m;
    map = (road *)malloc((m + 1)*sizeof(road));
    father = (int*)malloc((n + 1)*sizeof(int));

    for (int i = 1; i <= m; i++){
        cin >> map[i].start >> map[i].end >> map[i].length;
    }
    for (int i = 1; i <= n; i++){
        father[i] = i;
    }
    qsort(map + 1, m, sizeof(road), roadCompare);

    //Kruskal核心算法
    for (int i = 1; i <= m; i++){
        if (findFather(map[i].start) != findFather(map[i].end)){
            countRoad++;
            sum += map[i].length;
            father[findFather(map[i].start)] = findFather(map[i].end);
        }
        if (countRoad == n - 1){
            break;
        }
    }

    if (countRoad != n - 1){
        cout << -1 << endl;
    }
    else{
        cout << sum << endl;
    }

    return 0;
}
int roadCompare(const void* a, const void* b)
{
    int c = (*(road*)a).length - (*(road*)b).length;
    if (c > 0){
        return 1;
    }
    else if (c == 0){
        return 0;
    }
    else return -1;
}
int findFather(int i)
{
    if (father[i] == i){
        return i;
    }
    else{
        return father[i] = findFather(father[i]);
    }
}
时间: 2024-08-10 15:01:30

公路村村通(30)的相关文章

pta08-图7 公路村村通 (30分)

08-图7 公路村村通   (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N):随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本.为简单起见,城镇从1到N编号. 输出格式: 输出村村通需要的最低成本.如果输入数据不足以保证畅通,则输出−1,表示需要建设更多公路. 输入样例: 6

5-10 公路村村通 (30分)

5-10 公路村村通   (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数NN(\le 1000≤1000)和候选道路数目MM(\le 3N≤3N):随后的MM行对应MM条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本.为简单起见,城镇从1到NN编号. 输出格式: 输出村村通需要的最低成本.如果输入数据不足以保证畅通,则输出-1?1,

PTA 08-图7 公路村村通 (30分)

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数NN(\le 1000≤1000)和候选道路数目MM(\le 3N≤3N):随后的MM行对应MM条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本.为简单起见,城镇从1到NN编号. 输出格式: 输出村村通需要的最低成本.如果输入数据不足以保证畅通,则输出-1?1,表示需要建设更多公路. 输入样例: 6

08-图7 公路村村通 (30 分)

/*prim算法*/ 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAX 1002 4 #define INF 500001 5 6 typedef int Vertex; 7 typedef int Weight; 8 9 typedef struct ENode* Edge; 10 struct ENode { 11 Vertex V1; 12 Vertex V2; 13 Weight W; 14 }; 15 16 ty

7-10 公路村村通

7-10 公路村村通(30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N):随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本.为简单起见,城镇从1到N编号. 输出格式: 输出村村通需要的最低成本.如果输入数据不足以保证畅通,则输出?1,表示需要建设更多公路. 输入样例: 6 15

08-图7 公路村村通(30 分)Prim

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N):随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本.为简单起见,城镇从1到N编号. 输出格式: 输出村村通需要的最低成本.如果输入数据不足以保证畅通,则输出?1,表示需要建设更多公路. 输入样例: 6 15 1 2 5 1 3 3 1 4 7

08-图7 公路村村通 (30 分

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤)和候选道路数目M(≤):随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本.为简单起见,城镇从1到N编号. 输出格式: 输出村村通需要的最低成本.如果输入数据不足以保证畅通,则输出?,表示需要建设更多公路. 输入样例: 6 15 1 2 5 1 3 3 1 4 7 1 5 4

08-图7 公路村村通

题目: 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N):随后的M行对应MM条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本.为简单起见,城镇从1到N编号. 输出格式: 输出村村通需要的最低成本.如果输入数据不足以保证畅通,则输出?1,表示需要建设更多公路. 输入样例: 6 15 1 2 5 1 3 3

pta 编程题21 公路村村通

其它pta数据结构编程题请参见:pta 题目 这道题考察最小生成树问题,用的是Prim算法. 1 #include <iostream> 2 using namespace std; 3 4 int N, M; 5 int** G; 6 void buildGraph(); 7 void deleteGraph(); 8 int prim(); 9 int findMinDist(int dist[]); 10 11 int main() 12 { 13 cin >> N >