题目描述

如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz

输入输出格式

输入格式:

第一行包含两个整数N、M,表示该图共有N个结点和M条无向边。(N<=5000,M<=200000)

接下来M行每行包含三个整数Xi、Yi、Zi,表示有一条长度为Zi的无向边连接结点Xi、Yi

输出格式:

输出包含一个数,即最小生成树的各边的长度之和;如果该图不连通则输出orz

输入输出样例

输入样例#1:

4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3
输出样例#1:

7

说明

时空限制:1000ms,128M

数据规模:

对于20%的数据:N<=5,M<=20

对于40%的数据:N<=50,M<=2500

对于70%的数据:N<=500,M<=10000

对于100%的数据:N<=5000,M<=200000

Kruskal:

将m条边按边权从小到大排序,枚举每条边,如果该边的起点和终点已经在最小生成树中,则跳过,否则就将这条边加入到最小生成树中。具体实现方面会借助于并查集,来判断两个点是否在最小生成树中(已连通)。//边

 #include<iostream>
#include<algorithm>
using namespace std;
int n,m;
struct kkk{
int qd,zd,len;
}bian[];
bool cmp(kkk a,kkk b) {//按照边权大小排序
return a.len < b.len;
}
int f[];
int getf(int o) {//找父亲
if(o == f[o]) return o;
return f[o] = getf(f[o]);
}
int main(){
cin >> n >> m;
for(int i = ;i <= m; i++)
cin >> bian[i].qd >> bian[i].zd >> bian[i].len;
sort(bian+,bian+m+,cmp);
for(int i = ;i <= n;i++)
f[i] = i;
int ans = ;
for(int i = ;i <= m; i++) {
int p1 = bian[i].qd;
int p2 = bian[i].zd;
int f1 = getf(p1);
int f2 = getf(p2);
if(f1 != f2) {//判断两个点是否在一个集合里 ,如果不在,就加上一条边
ans += bian[i].len;
f[f1] = f2;
}
}
cout<<ans;
return ;
}

Kruskal

Prim:

将所有点分在两个集合中,a集合中存已经被连入最小生成树中的点,b集合中存还没在最小生成树中的点 。

开始时a为空,将所有点放到b里。任选一个点为根放到a中,并找到一条a集合到b集合最短的一条边,边两端的节点不定,但必须保证分别在a,b两个集合中,我们可以用并查集维护。将这条边b集合的端点放到a集合,答案加上这条边,直至b集合为空。//点

 #include<iostream>
#include<cstdio>
#include<cstring> using namespace std; int n,m,g[][],x,y,v,dis[],ans;
bool b[]; void prim() {
for(int i = ;i <= n; i++) dis[i] = g[][i];
dis[] = ;
b[] = true;
for(int i = ;i < n; i++) {
int k = ;
for(int j = ;j <= n; j++)
if(!b[j] && dis[j] < dis[k]) k = j;
b[k] = true;
ans += dis[k];
for(int j = ;j <= n; j++) {
if(dis[j] > g[k][j])
dis[j] = g[k][j];
}
}
} int main() {
scanf("%d%d",&n,&m);
memset(g,0x3f,sizeof(g));
for(int i = ;i <= n; i++) g[i][i] = ;
for(int i = ;i <= m; i++) {
scanf("%d%d%d",&x,&y,&v);
g[x][y] = g[y][x] = min(g[x][y],v);
}
prim();
printf("%d",ans);
return ;
}

Prim

 

最新文章

  1. [logstash-input-file]插件使用详解
  2. Unity multi_compile
  3. ipython
  4. libyuv 编译 for android
  5. IP报文解析及基于IP 数据包的洪水攻击
  6. hdu1560 搜索
  7. TestNG Listener
  8. W3C vs. WHATWG HTML5 Specs – The Differences Documented
  9. SQL 截图
  10. 犯罪团伙利用POS机刷信用卡积分转卖 年获利千万
  11. chapter3习题
  12. Scrum Meeting Alpha - 7
  13. IntelliJ IDEA 配置 smartGit
  14. Codeforces Round #396(Div. 2) A. Mahmoud and Longest Uncommon Subsequence
  15. JS购物车编辑
  16. 在HTML中限制input 输入框只能输入纯数字
  17. 使用U盘安装Ubuntu系统
  18. 运算符,比如+, -, &gt;, &lt;, 以及下标引用[start:end]等等,从根本上都是定义在类内部的方法。
  19. 新建一个去除storyboard的项目
  20. 【C++程序员学 python】python 之变量

热门文章

  1. NOIP2018普及游记
  2. Linux下汇编语言学习笔记46 ---
  3. poj-1979 &amp;&amp; hdoj - 1312 Red and Black (简单dfs)
  4. [bzoj4519][Cqoi2016]不同的最小割_网络流_最小割_最小割树
  5. SQLServer时间分段查询
  6. cocos2d-x 3.0 CREATE_FUNC解析
  7. C - The C Answer (2nd Edition) - Exercise 1-5
  8. MySQL-子查询,派生表,通用表达式
  9. onload onmouseover 事件监听
  10. HDU 1724 Ellipse 【自适应Simpson积分】