http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640

一开始想的时候,看到要使得最大值最小,那这样肯定是二分这个最大值了,然后每一次都跑一次kruskal

这样的复杂度是O(E * 64),然后被卡TLE了

然后观察到kruskal的时候,如果最大边是val,那么比val大的是不要的了,然后整个数组也是有序的。

比如7、6、5、4、3、2、1等,这个也是可以lower_bound的,然后lower_bound后就能过,600ms

改了lower_bound后,我忘记删除那个if了,居然还是超时。TAT,这数据有点强。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset>
int n, m;
const int maxn = 2e5 + ;
struct Edge {
int u, v, w;
bool operator < (const struct Edge & rhs) const {
return w > rhs.w;
}
}e[maxn];
int fa[maxn];
void init() {
for (int i = ; i <= n; ++i) fa[i] = i;
}
int tofind(int u) {
if (fa[u] == u) return u;
else return fa[u] = tofind(fa[u]);
}
void tomerge(int x, int y) {
x = tofind(x);
y = tofind(y);
fa[y] = x;
}
LL nowAns;
bool check(LL val) {
init();
int sel = ;
nowAns = ;
struct Edge t;
t.w = val;
int pos = lower_bound(e + , e + + m, t) - e;
for (int i = pos; i <= m; ++i) {
// if (e[i].w > val) continue; 卡TLE
if (tofind(e[i].u) == tofind(e[i].v)) continue;
tomerge(e[i].u, e[i].v);
nowAns += e[i].w;
sel++;
if (sel == n - ) {
return true;
}
}
return false;
}
void work() {
scanf("%d%d", &n, &m);
LL lo = 1e18L, hi = -1e18L;
for (int i = ; i <= m; ++i) {
scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
lo = min(lo, (LL)e[i].w);
hi = max(hi, (LL)e[i].w);
}
sort(e + , e + + m);
while (lo <= hi) {
LL mid = (lo + hi) >> ;
if (check(mid)) {
hi = mid - ;
} else lo = mid + ;
}
check(lo);
// printf("%lld\n", nowAns);
cout << nowAns << endl;
// struct Edge t;
// t.w = 3;
// int pos = lower_bound(e + 1, e + 1 + m, t) - e;
// cout << pos << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}

然后就上网看题解了,然后发现自己做法很复杂了。

感觉是题意弄得我们想复杂了,又魔法连的值,又总和,

正解是kruskal两次,第一次就能找出最大值最小,然后从大的再kruskal一次。

但是为什么还是700ms,有点坑。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset>
int n, m;
const int maxn = 2e5 + ;
struct Node {
int u, v, w;
bool operator < (const struct Node & rhs) const {
return w < rhs.w;
}
}e[maxn];
bool cmp(struct Node a, struct Node b) {
return a.w > b.w;
}
int fa[maxn];
int tofind(int u) {
if (fa[u] == u) return u;
else return fa[u] = tofind(fa[u]);
}
void tomerge(int x, int y) {
x = tofind(x);
y = tofind(y);
fa[y] = x;
}
void init() {
for (int i = ; i <= n; ++i) fa[i] = i;
}
int result() {
init();
int sel = ;
for (int i = ; i <= m; ++i) {
if (tofind(e[i].u) == tofind(e[i].v)) continue;
tomerge(e[i].u, e[i].v);
sel++;
if (sel == n - ) return e[i].w;
}
}
void work() {
scanf("%d%d", &n, &m);
for (int i = ; i <= m; ++i) {
scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
}
sort(e + , e + + m);
int mx = result();
sort(e + , e + + m, cmp);
init();
LL ans = ;
int sel = ;
for (int i = ; i <= m; ++i) {
if (e[i].w > mx) continue;
if (tofind(e[i].u) == tofind(e[i].v)) continue;
tomerge(e[i].u, e[i].v);
sel++;
ans += e[i].w;
if (sel == n - ) break;
}
printf("%lld\n", ans);
// cout << ans << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}

51nod 1640 天气晴朗的魔法 二分 + 克鲁斯卡算法(kruskal算法) 做复杂了的更多相关文章

  1. 51Nod - 1640 天气晴朗的魔法 大+小生成树(最大值最小)/二分

    天气晴朗的魔法 这样阴沉的天气持续下去,我们不免担心起他的健康.   51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动.   N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的 ...

  2. 51nod 1640 天气晴朗的魔法

    题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 这样阴沉的天气持续下去,我们不免担心起他的健康.   51nod魔法学校近日开展了主题为“天气晴朗 ...

  3. 51nod 1640 天气晴朗的魔法 最小生成树

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 题解: 先求最小生成树,记录最大边. 然后求最大生成树 ...

  4. 51nod——1640 天气晴朗的魔法 有边权限制的最大生成树

    好好读题嗷:“所以我们要求阵中的魔法链的魔力值最大值尽可能的小,与此同时,魔力值之和要尽可能的大.” 第一条件是生成树的最大边权更小,第二条件是在最大边权的限制下搞一个最大生成树. 至于最大生成树,如 ...

  5. 51 Nod 1640 天气晴朗的魔法( Kruskall )

    #include <bits/stdc++.h> typedef long long LL; using namespace std; ; struct node{ LL u,v,w; n ...

  6. 51nod 天气晴朗的魔法 - (Kruskall最小生成树)

    题目: 基准时间限制:1 秒 空间限制:131072 KB  51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动.   N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的魔力连接 ...

  7. 51nod 1640 MST+二分

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 1640 天气晴朗的魔法 题目来源: 原创 基准时间限制:1 秒 ...

  8. 51nod-1640--天气晴朗的魔法(简单最小生成树)

    1640 天气晴朗的魔法 题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 这样阴沉的天气持续下去,我们不免担心起他的健康. 51nod魔法学校近日 ...

  9. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){ if ( ...

随机推荐

  1. Android图片加载神器之Fresco-加载图片基础[详细图解Fresco的使用](秒杀imageloader)

    Fresco简单的使用—SimpleDraweeView 百学须先立志—学前须知: 在我们平时加载图片(不管是下载还是加载本地图片…..)的时候,我们经常会遇到这样一个需求,那就是当图片正在加载时应该 ...

  2. git解决冲突方式

    Git解决冲突 安装beyond compare 4 2.配置git对比工具 #difftool 配置 git config --global diff.tool bc4 git config --g ...

  3. NOI2017退役记

    Day1 全世界都200+我162,考场上fread和fwrite写挂了直接删了,然后就被卡了48也是没谁了. Day2 2-SAT写挂,就没有然后了. 明明退役前一直都在做自己最想做的事情,连这就是 ...

  4. C++之STL迭代器

    迭代器是一种检查容器内元素并遍历元素的数据类型.可以替代下标访问vector对象的元素. 每种容器类型都定义了自己的迭代器类型,如 vector: vector<int>::iterato ...

  5. uiautomator2.0框架

    1.   Uiautomator1.0 Uiautomator2.0 date 2012 2015 super class UiAutomatorTestCase InstrumentationTes ...

  6. bzoj4006

    斯坦纳树 比之前要求高了一些 其实利用斯坦纳树的dp[i][s]以i为根,S为状态就行了,先跑一遍斯坦纳树,预处理出dp数组,记住每个S的最小值,然后再dp,这里dp必须要求同一种颜色的状态都必须在S ...

  7. 一、MyBatis简介

    1.发展历史 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBa ...

  8. 通过url在两个页面之间传值

    今天开发遇到一个需要通过url传值才能解决的问题,就查了一下资料 一下是整理的结果: 假如需要把a页面的值传到b页面 a页面代码 <script type="text/javascri ...

  9. 常用的网站站长SEO工具

    网站管理员工具 网站管理员工具需要对网站域名所有权进行验证,通常是通过上传指定文件.增加META或者修改网站DNS来验证管理员身份,通过验证后,网站管理员可以查询到自己网站的各类统计信息. 1. Go ...

  10. E20190225-hm

    seal  n. 密封; 印章; 海豹; 封条;   v. 密封; 盖章; 决定; 封上(信封); primitive adj. 原始的; 发展水平低的; 落后的; [生物学] 原生的;  n. 原始 ...