Description
当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本。
Input
连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供选择的道路数目M(M <= 3000),随后M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个村庄的编号和修建该道路的预算成本,村庄从1~N编号。
Output
输出使每个村庄都有公路连通所需要的最低成本,如果输入数据不能使所有村庄畅通,则输出-1,表示有些村庄之间没有路连通。
Sample
Input

5 8
1 2 12
1 3 9
1 4 11
1 5 3
2 3 6
2 4 9
3 4 4
4 5 6

Output
19

Hint

算法讲解:
Prim和Kruskal
学习Kruska算法需要先掌握并查集:
并查集

//Prim
#include<bits/stdc++.h>using namespace std;
#define INF 0x3f3f3f3f
const int N = 1111;int mp[N][N], book[N];
int prim(int n)//最小生成树普利姆算法,加点法,适合稠密图
{int dp[N];for(int i = 1; i <= n; i++){book[i] = 0;dp[i] = mp[1][i];//初始化。1点与i点之间的权值}book[1] = 1;//第一个不进行循环int sum = 0;int minn;int flag;for(int i = 1; i < n; i++){minn = INF;flag = -1;for(int j = 1; j <= n; j++){if(!book[j] && dp[j] < minn){minn = dp[j];flag = j;}}if(minn == INF)return -1;book[flag] = 1;sum += minn;for(int j = 1; j <= n; j++){if(!book[j] && dp[j] > mp[flag][j]){dp[j] = mp[flag][j];}}}return sum;
}int main()
{int n, m;//n个村庄,m条路while(cin >> n >> m){for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++)//对图进行初始化{if(i == j)mp[i][j] = 0;elsemp[i][j] = INF;}}while(m--){int u, v, k;cin >> u >> v >> k;if(k < mp[u][v]){mp[u][v] = mp[v][u] = k;}}int sum;sum = prim(n);cout << sum << endl;}return 0;
}
#include<bits/stdc++.h>using namespace std;const int N = 1005, M = 3005;
int Next[N];struct node
{int u, v, len;
} edge[M];
int cmp(node a, node b)
{return a.len < b.len;
}
void init(int n)//并查集初始化
{for(int i = 1; i <= n; i++)Next[i] = i;
}int find_root(int i)
{if(Next[i] == i)return Next[i];else{Next[i] = find_root(Next[i]);return Next[i];}
}int merage(int u, int v)
{int t1 = find_root(u), t2 = find_root(v);if(t1 != t2){Next[t1] = Next[t2];return 1;}elsereturn 0;
}
int main()
{int n, m;while(cin >> n >> m){for(int i = 1; i <= m; i++){cin >> edge[i].u >> edge[i].v >> edge[i].len;}sort(edge + 1, edge + 1 + m, cmp);//将边按权值从小到大排序int sum = 0, flag = 0;init(n);for(int i = 1; i <= m; i++){if(merage(edge[i].u, edge[i].v))sum += edge[i].len;}for(int i = 1; i <= n; i++){if(Next[i] == i)flag++;}if(flag == 1)cout << sum << endl;elsecout << -1 << endl;}return 0;
}

数据结构实验之图论六:村村通公路(最小生成树Prim/Kruskal)相关推荐

  1. SDUT-3362 数据结构实验之图论六:村村通公路

    数据结构实验之图论六:村村通公路 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descripti ...

  2. 数据结构实验之图论六:村村通公路

    数据结构实验之图论六:村村通公路 Time Limit: 1000MS Memory limit: 65536K 题目描述 当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各 ...

  3. SDUT_2121数据结构实验之链表六:有序链表的建立 (对建立的单项链表结构进行排序)

    点击打开链接 数据结构实验之链表六:有序链表的建立 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...

  4. SDUT-3378_数据结构实验之查找六:顺序查找

    数据结构实验之查找六:顺序查找 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在一个给定的无序序列里,查找与给定关键字 ...

  5. 山东理工OJ【2121】数据结构实验之链表六:有序链表的建立(插排法)

     数据结构实验之链表六:有序链表的建立 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 输入N个无序的整数,建立一个有序链表, ...

  6. SDUT-2121_数据结构实验之链表六:有序链表的建立

    数据结构实验之链表六:有序链表的建立 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入N个无序的整数,建立一个有序链 ...

  7. 数据结构实验之图论七:驴友计划(最新版)

    数据结构实验之图论七:驴友计划 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 做为一个资深驴友,小新有一张珍藏的自驾游 ...

  8. 数据结构实验之图论九:最小生成树

    数据结构实验之图论九:最小生成树 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 有n个城市,其中有些城市之间可以修建公 ...

  9. SDUT 2142 数据结构实验之图论二:基于邻接表的广度优先搜索遍历

    数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Descript ...

最新文章

  1. iis多进程下的全局变量_Linux下c程序的内存映像
  2. linux命令 - alias
  3. 简单七步让你轻松安全迁移网站
  4. 开关造成的毛刺_模具清洗机干冰清洗机干冰去毛刺机安全注意事项
  5. OpenCV与图像处理学习十一——分水岭算法(含代码)
  6. dj电商-模型类设计-商品模块数据表
  7. 代码 纪录 软件_「软件资料」-「资讯动态」-软件开发类项目关键文档内容要求...
  8. cscd论坛_高压电器第九届电工技术前沿问题学术论坛“先进电磁技术”分论坛及专题征稿...
  9. 2018-12支付宝红包赚钱薅羊毛全攻略
  10. iPhone11的计算机怎么用,iPhone11怎么自设铃声
  11. Android Studio 实现播放本地/网络视频
  12. 【ECharts学习】—实现中国地图
  13. 14款超时尚的HTML5时钟动画
  14. 转:西部数据NAS设备hack
  15. 星星之火-36:LTE载波载波的间隔是15K, 载波波的带宽是多少? 15K还是30K?
  16. ROS:rosbag play系列指令(详解)
  17. Java播放声音文件
  18. 芯片电源类引脚符号标识及其含义
  19. 计算机主机并联,如何一台主机多台电脑使用
  20. c#程序员面试题汇总,方便自己记录

热门文章

  1. apt-get -y install中的-y是什么意思?
  2. SpringBoot 搭建微信小程序支付(JSAPI) 纯后端
  3. android异常相机处理器,Android抛出错误:不幸的是相机已停止在Android模拟器中
  4. 基于短周期价量特征的多因子选股体系的实现(三)----因子计算
  5. u-boot for tiny210 ver3.1 (by liukun321咕唧咕唧)
  6. 数据库指向默认模式(Schema)
  7. pc端微信分享(不是直接分享)
  8. python计算协方差矩阵_协方差矩阵、相关系数矩阵的EXCEL和python实现
  9. java enum从几开始,Enum应该从0还是1开始?
  10. 计算机狐狸标志的程序,Firefox 推出新 logo,这只狐狸长这样子