codevs 1231 最优布线问题 x(find函数要从娃娃抓起系列)
学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的。为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接。
为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算这个最小的费用。
输入第一行为两个整数n,m(2<=n<=100000,2<=m<=100000),表示计算机总数,和可以互相建立连接的连接个数。接下来m行,每行三个整数a,b,c 表示在机器a和机器b之间建立连接的话费是c。(题目保证一定存在可行的连通方案, 数据中可能存在权值不一样的重边,但是保证没有自环)
输出只有一行一个整数,表示最省的总连接费用。
3 3
1 2 1
1 3 2
2 3 1
2
最终答案需要用long long类型来保存
分类标签 Tags 点此展开
(把find(f[x]改为f[x]=find(f[x])))
这样一个处理!
不然数据越大,越难弄,需要从低向上找很久很久
运行结果
测试点#1.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#2.in 结果:AC 内存使用量: 492kB 时间使用量: 15ms
测试点#3.in 结果:AC 内存使用量: 620kB 时间使用量: 26ms
测试点#4.in 结果:TLE 内存使用量: 3176kB 时间使用量: 1000ms
测试点#5.in 结果:TLE 内存使用量: 2924kB 时间使用量: 1000ms
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define Maxn 100010 using namespace std; long long n,m,tot=,f1,f2,k;
long long f[Maxn];
bool u[Maxn]; struct gx{
long long x;
long long y;
long long w;
bool operator < (const gx &qwq)const
{
return w<qwq.w;
}
}gx[Maxn]; int find(int x)
{
//if(f[x]!=x) f[x]=find(f[x]);
//return f[x];
return x == f[x] ? x : find(f[x]);
} int main()
{
//ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=;i<=m;i++)
{
cin>>gx[i].x>>gx[i].y>>gx[i].w;
}
for(int i=;i<=n;i++) f[i]=i;
sort(gx+,gx++m);
for(int i=;i<=m;i++)
{
f1=find(gx[i].x);
f2=find(gx[i].y);
if(f1!=f2)
{
f[f2]=f1;
++k;
tot+=gx[i].w;
}
if(k==n-) break;
}
cout<<tot<<endl;
return ;
}
AC的两个代码:
1)原因仅仅是因为把find函数改了
数据如下:
运行结果
测试点#1.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#2.in 结果:AC 内存使用量: 488kB 时间使用量: 12ms
测试点#3.in 结果:AC 内存使用量: 744kB 时间使用量: 25ms
测试点#4.in 结果:AC 内存使用量: 3052kB 时间使用量: 147ms
测试点#5.in 结果:AC 内存使用量: 2920kB 时间使用量: 142ms
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define Maxn 100010 using namespace std; long long n,m,tot=,f1,f2,k;
long long f[Maxn];
bool u[Maxn]; struct gx{
long long x;
long long y;
long long w;
bool operator < (const gx &qwq)const
{
return w<qwq.w;
}
}gx[Maxn]; int find(int x)
{
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
//return x == f[x] ? x : find(f[x]);
} int main()
{
//ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=;i<=m;i++)
{
cin>>gx[i].x>>gx[i].y>>gx[i].w;
}
for(int i=;i<=n;i++) f[i]=i;
sort(gx+,gx++m);
for(int i=;i<=m;i++)
{
f1=find(gx[i].x);
f2=find(gx[i].y);
if(f1!=f2)
{
f[f2]=f1;
++k;
tot+=gx[i].w;
}
if(k==n-) break;
}
cout<<tot<<endl;
return ;
}
2)优化版(把cin,cout优化)
代码:
数据:
运行结果
测试点#1.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#2.in 结果:AC 内存使用量: 492kB 时间使用量: 4ms
测试点#3.in 结果:AC 内存使用量: 616kB 时间使用量: 10ms
测试点#4.in 结果:AC 内存使用量: 3180kB 时间使用量: 60ms
测试点#5.in 结果:AC 内存使用量: 3048kB 时间使用量: 54ms
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define Maxn 100010 using namespace std; long long n,m,tot=,f1,f2,k;
long long f[Maxn];
bool u[Maxn]; struct gx{
long long x;
long long y;
long long w;
bool operator < (const gx &qwq)const
{
return w<qwq.w;
}
}gx[Maxn]; int find(int x)
{
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
//return x == f[x] ? x : find(f[x]);
} int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=;i<=m;i++)
{
cin>>gx[i].x>>gx[i].y>>gx[i].w;
}
for(int i=;i<=n;i++) f[i]=i;
sort(gx+,gx++m);
for(int i=;i<=m;i++)
{
f1=find(gx[i].x);
f2=find(gx[i].y);
if(f1!=f2)
{
f[f2]=f1;
++k;
tot+=gx[i].w;
}
if(k==n-) break;
}
cout<<tot<<endl;
return ;
}
codevs 1231 最优布线问题 x(find函数要从娃娃抓起系列)的更多相关文章
- Codevs 1231 最优布线问题
题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外 ...
- (最小生成树) codeVs 1231 最优布线问题
题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外 ...
- codevs1231 最优布线问题
1231 最优布线问题 题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地 ...
- 最优布线问题(wire.cpp)
最优布线问题(wire.cpp) [问题描述] 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来.两台计算机被连接是指它们间有数据线连接.由于计算机所处的位置不同,因此不同的两台计算机的 ...
- 27.prim算法 最优布线问题(wire.cpp)
[例4-10].最优布线问题(wire.cpp) [问题描述] 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来.两台计算机被连接是指它们间有数据线连接.由于计算机所处的位置不同,因此不 ...
- [图论]最优布线问题:kruskal
最优布线问题 目录 最优布线问题 Description Input Output Sample Input Sample Output Hint 解析 代码 Description 学校有n台计算机 ...
- [图论]最优布线问题:prim
最优布线问题 目录 最优布线问题 Description Input Output Sample Input Sample Output Hint 解析 代码 Description 学校有n台计算机 ...
- [wikioi]最优布线问题
http://wikioi.com/problem/1231/ Kruskal+并查集.comp函数里面如果用const引用的话,可以减少copy.并查集find的时候是递归找父亲的根.无他. #in ...
- T1231 最优布线 codevs
http://codevs.cn/problem/1231/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 学校需要将n ...
随机推荐
- (一)使用twisted Deferred
一.开篇 为什么是twisted,twisted作为一个python网络编程框架,出道早,但一直不温不火,这几年和tornado比起来,更是近乎销声匿迹:但作为初学者,觉得twisted还是有很多优点 ...
- 阿里云对象存储OSS
阿里云的产品种类繁多,今天让我们一起来了解下对象存储(Object Storage Service,简称OSS)吧! 什么是对象存储呢? 简单来说,对象存储OSS是阿里云提供的海量.安全和高可靠的云存 ...
- mybatis整体流程
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
- 使用Redis實現秒殺功能
<?php $id = 1; $pdo=new PDO("mysql:host=127.0.0.1;dbname=test","root","r ...
- 如何用纯 CSS 创作一个晃动的公告板
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/wjZoGV 可交互视频教 ...
- Momentum Contrast for Unsupervised Visual Representation Learning
Momentum Contrast for Unsupervised Visual Representation Learning 一.Methods Previously Proposed 1. E ...
- C# 面向对象7 命名空间
命名空间 **namespace(命名空间),用于解决类重名问题,可以看作"类的文件夹" **如果代码和被使用的类在一个namespace则不需要using **在不同命名空间下的 ...
- [转载]static in Java
来源:https://www.cnblogs.com/chenssy/p/3386721.html 一. static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现 ...
- linux之信息查看
在使用Linux操作系统的时候,有时候会需要了解当前使用的系统版本信息,特别是在给别人进行服务器部署运维的时候,准确的系统版本信息至关重要 查看linux内核版本信息: cat /proc/vers ...
- 关于sqlmap的两个小坑
i春秋作家:__LSA__ 0x00 概述 近日在利用sqlmap注入测试时遇到一个奇怪的现象,高版本sqlmap无法检测出注入,但是低版本的可以测出注入,并且能跑出数据不是误报,经过对比测试和查看s ...