pat 公路村村通--最新小生成树
2016-04-20 20:36
399 查看
公路村村通 (30分)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
1000≤1000)和候选道路数目MMM(≤3N\le
3N≤3N);随后的MMM行对应MMM条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到NNN编号。
本题就是求图的最小生成树
使用vector做邻接表存储图
我用的是krusal算法,我们先把给出的边按照权值排序,然后每次选择权值最小的边,这里要判断是不是边选重了(即连接边的点被选了2次),用并查集判断,知道选择出n-1条边
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入格式:
输入数据包括城镇数目正整数NNN(≤1000\le1000≤1000)和候选道路数目MMM(≤3N\le
3N≤3N);随后的MMM行对应MMM条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到NNN编号。
输出格式:
输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−1-1−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
本题就是求图的最小生成树
使用vector做邻接表存储图
我用的是krusal算法,我们先把给出的边按照权值排序,然后每次选择权值最小的边,这里要判断是不是边选重了(即连接边的点被选了2次),用并查集判断,知道选择出n-1条边
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #include <algorithm> using namespace std; typedef struct Bian{ int v1,v2; int w; ///权值 }bian; int n,m; int f[1001]; ///并查集使用的数组 bool cmp(const bian a,const bian b){ return a.w < b.w; } void init(){ for(int i = 1; i <= 1001; ++i){ f[i] = i; } } int getf(int a){ ///并查集里寻找祖先 if(a == f[a]) return a; return f[a] = getf(f[a]); } int merge(int a,int b){ ///并查集的合并 int ta,tb; ta = getf(a); tb = getf(b); if(ta == tb) return 0; f[ta] = tb; return 1; } int main(int argc, char *argv[]) { int ans = 0; int count = 0; vector<bian> v; init(); scanf("%d%d",&n,&m); getchar(); int temp = m; while(m--){ ///边的输入,构建图的邻接表 bian tmp1; int x,y,ww; scanf("%d%d%d",&x,&y,&ww); tmp1.v1 = x; tmp1.v2 = y; tmp1.w = ww; v.push_back(tmp1); } sort(v.begin(),v.end(),cmp); ///根据权值对边排序 for(int i = 0; i < v.size(); ++i){ int t = merge(v[i].v1,v[i].v2); if( t ){ ans += v[i].w; count++; } if(count == n-1) break; } if(count != n-1) printf("-1\n"); ///如果最后没有选出n-1条边,那么只能是条件不够 else printf("%d\n",ans); return 0; }
相关文章推荐
- 需要有放弃的精神,有些人不是你的客户,就别勉强
- bzoj 2461: [BeiJing2011]符环
- poj 1925(坐标上的dp)
- 迷你DVD管理器,尽量缩短代码长度!!!
- hdu 2159
- hdu 2159
- ZOJ 3778 Talented Chef【贪心】
- codeforces 86D. Powerful array(莫队算法)
- Linux获取pci设备的厂商号、设备号、class号
- 阿里巴巴2016java研发笔试附加题
- 友元类
- 【JUC】JDK1.8源码分析之CountDownLatch(五)
- golang RSA加密解密程序
- Linux make方法安装文件是./configure问题解决方法
- sqlite异常掉电相关问题(1)
- BZOJ2243 【SDOI2011】染色 树链剖分
- 趣谈——深拷贝和浅拷贝
- 自定义类型使用hash_map时自定义hash函数
- SpringMvc中自动注入失败原因
- 标识符、字符集