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 ...
随机推荐
- mysql拆分逗号一列变多行
需求: SELECT ), ) FROM TABLE a INNER JOIN mysql.help_topic b )
- SpreadJS 纯前端表格控件 V12.2 发布更新
用不到100行代码,在前端实现Excel的全部功能 千万前端开发者翘首企盼,SpreadJS V12.2 终发布更新:六大功能特性,带来更多便利,用不到100行代码,在前端实现Excel的全部功能! ...
- Linux系统下部署Tomcat服务器
详细步骤如下: 1.下载xshell5和xftp5并安装,登录连接服务器,新建会话窗口: 2.安装配置JDK1.8,具体操作方法如下: (1)下载JDK地址:http://www.oracle.com ...
- c++学习笔记之类和对象(二、构造函数和析构函数)
1.构造函数(Constructor):在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行. 这种特殊的成员函数就是构造函 ...
- QQ登錄實現功能
<html> <head> <title></title> </head> <body> <form> <p& ...
- Ruby Rails正式学习:Ruby on Rails 做个演示项目吧,逐渐完善
项目开始 一. 新建Rails项目 1. 修改一下Gemfile文件(简单修改一下) source 'https://rubygems.org' git_source(:github) { |repo ...
- Linux安全审计
Client: OMAudit_agent.py #!/usr/bin/env python #coding:utf- import sys import socket import fcntl im ...
- 33.服务之间的调用之RPC、Restful深入理解
33.服务之间的调用之RPC.Restful深入理解 2018年05月08日 01:52:42 郑学炜 阅读数 13577更多 分类专栏: 6.框架 版权声明:本文为博主原创文章,遵循CC 4.0 ...
- shell脚本获取的参数
$# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表
- django用户投票系统详解
投票系统之详解 1.创建项目(mysite)与应用(polls) django-admin.py startproject mysite python manage.py startapp polls ...