[SCOI2005]繁忙的都市

Link
这是一道模板题,不细讲。但是这涉及到最小生成树一个重要性质:
uuu到vvv的路径中,最大值最小的一条是最小生成树上的一条路径。

#include<bits/stdc++.h>
#define ll long long
#define N 305
#define inf 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define lowbit(i) ((i)&(-i))
using namespace std;
int n,m,fa[N],cnt,ans;
struct node{int u,v,w;bool operator <(const node &o) const{return o.w > w;}
}e[N*N];
int find(int x){return fa[x]==x?fa[x]:fa[x] = find(fa[x]);
}
void uni(int x,int y){fa[find(x)] = find(y);
}
int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);ios::sync_with_stdio(0);cin.tie(0);scanf("%d%d",&n,&m);for(int i = 1;i <= m;++i)scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);for(int i = 1;i <= n;++i) fa[i] = i;sort(e+1,e+m+1);for(int i = 1;i <= m;++i){if(find(e[i].u) == find(e[i].v)) continue;uni(e[i].u,e[i].v);cnt++;ans = max(e[i].w,ans);}printf("%d %d",cnt,ans);return 0;
}

[HNOI2006]公路修建问题

Link

题目大意

给出一张无向带权图,每条边可以选择建一级道路或者二级道路,花费为c1c_1c1​和c2c_2c2​。
现在至少要建kkk条一级道路,问生成树中边权最大值最小是多少。

做法

二分最大值,跑kruskalkruskalkruskal的时候,先把能选的都选成一级道路,剩下的选二级道路,判断是否满足条件。

#include<bits/stdc++.h>
#define ll long long
#define N 10015
#define M 20015
#define inf 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define lowbit(i) ((i)&(-i))
using namespace std;
int n,k,m,fa[N];
struct node{int u,v,c1,c2;
}e[M];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);
}
void uni(int x,int y){fa[find(x)] = find(y);
}
bool check(int val){for(int i = 1;i <= n;++i) fa[i] = i;int cnt = 0;for(int i = 1;i <= m;++i){if(find(e[i].u)==find(e[i].v)||e[i].c1 > val) continue;uni(e[i].u,e[i].v);cnt++;}if(cnt < k) return 0;for(int i = 1;i <= m;++i){if(find(e[i].u)==find(e[i].v)||e[i].c2 > val) continue;uni(e[i].u,e[i].v);cnt++;}if(cnt != n-1) return 0;return 1;
}
int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);ios::sync_with_stdio(0);cin.tie(0);cin>>n>>k>>m;int l = 0,r = 0;for(int i = 1;i < m;++i){cin>>e[i].u>>e[i].v>>e[i].c1>>e[i].c2;r = max(max(e[i].c1,e[i].c2),r);}while(l+3<r){//cout << l << ' ' << r << endl;int mid = (l+r)>>1;if(check(mid)) r = mid;else l = mid;}for(int i = l;i <= r;++i){if(check(i)){cout<<i;break;}}return 0;
}

BZOJ3732 Network

Link

题意

给出一张无向图,有qqq次询问,每次问你uuu到vvv所有路径中,边权最大值最小的一条的最大值是多少。
不难想到求出其最小生成树,对于每一个询问,在树上倍增求出lcalcalca的同时求出最小值,复杂度O(qlogn)O(qlogn)O(qlogn)
然后我发现了这道题

Loj #137. 最小瓶颈路 加强版
n≤7∗104n \le 7*10^4n≤7∗104,q≤107q \le 10^7q≤107
刚刚所讲的做法卡卡常数就能莽过去 不能通过此题。
于是我们有了一个新的解法,可以在O(nlogn+q)O(nlogn+q)O(nlogn+q)的复杂度下通过。

做法

1. kruskalkruskalkruskal重构树

对原图跑一遍kruskalkruskalkruskal,若u,vu,vu,v不在同一集合内,新建一个点toptoptop,合并u,v,topu,v,topu,v,top所在集合,并将u,vu,vu,v的祖先作为toptoptop的儿子,toptoptop有点权w(u,v)w(u,v)w(u,v)即u,vu,vu,v的边权。然后我们就得到了一个重要的性质,lca(u,v)lca(u,v)lca(u,v)的点权就是uuu到vvv所有路径中,边权最大值最小的一条的最大值。

2. lcalcalca

如何快速求出两点之间的lcalcalca?
倍增: 预处理O(nlogn)O(nlogn)O(nlogn) 查询O(logn)O(logn)O(logn) 显然不行。
于是我们有一种 预处理O(nlogn)O(nlogn)O(nlogn) 查询O(1)O(1)O(1)的做法
求出一棵树的欧拉序,然后做静态RMQRMQRMQ。
欧拉序类似于dfsdfsdfs序,只不过欧拉序是进入一次加111,回溯也加111,然后我们记录下fir[i]fir[i]fir[i]表示第一次访问iii的欧拉序,我们发现lca(u,v)lca(u,v)lca(u,v)就是fir[u]fir[u]fir[u]到fir[v]fir[v]fir[v]之间深度最小的节点,RMQRMQRMQ维护即可。
关于RMQ
关于lca

#include<bits/stdc++.h>
#define ll long long
#define N 1000015
#define inf 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define lowbit(i) ((i)&(-i))
using namespace std;
int n,m,q,fa[N],fir[N],dep[N],id[30][N],val[N],lg2[N],tot;
int A,B,C,P;
const int mod = 1e9+7;
inline int rnd(){ return A=(A*B+C)%P;}
struct node{int u,v,w;bool operator <(const node &a) const{return a.w > w;}
}G[N];
vector<int> e[N];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);
}
int Kruskal(){int top = n;for(int i = 1;i <= 2*n;++i) fa[i] = i;for(int i = 1;i <= m;++i){int x =  find(G[i].u),y = find(G[i].v);if(x == y) continue;//cout << x << " TTT " << y << " " << top+1 <<endl; val[++top] = G[i].w;fa[x] = fa[y] = top;e[top].pb(x);e[top].pb(y);e[x].pb(top);e[y].pb(top);}return top;
}
void dfs(int u,int f){//cout <<"EEE   " << u << endl;fir[u] = ++tot;dep[u] = dep[f]+1;id[0][tot] = u;for(int i = 0;i < e[u].size();++i){int v = e[u][i];if(v == f) continue;dfs(v,u);id[0][++tot] = u;}
}
void RMQ(){for(int i = 2;i <= tot;++i) lg2[i] = lg2[i>>1]+1;for(int j = 1;j <= 20;++j){for(int i = 1;i+(1<<j)-1 <= tot;++i){if(dep[id[j-1][i]] < dep[id[j-1][i+(1<<(j-1))]])id[j][i] = id[j-1][i];else id[j][i] = id[j-1][i+(1<<(j-1))];}}
}
int LCA(int u,int v){int l = fir[u],r = fir[v];if(l > r) swap(l,r);int k = lg2[r-l+1];if(dep[id[k][l]] < dep[id[k][r-(1<<k)+1]]) return id[k][l];return id[k][r-(1<<k)+1];
}
int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);ios::sync_with_stdio(0);cin.tie(0);scanf("%d%d",&n,&m);for(int i = 1;i <= m;++i)scanf("%d%d%d",&G[i].u,&G[i].v,&G[i].w);sort(G+1,G+m+1);int root = Kruskal();
//  for(int i = 1;i <= 2*n;++i){//      cout << "fff " << i << ":  ";
//      for(auto v:e[i]){//          cout << v << ' ';
//      }
//      cout << endl;
//  }dfs(root,0);RMQ();scanf("%d",&q);scanf("%d%d%d%d",&A,&B,&C,&P);int ans = 0;while(q--){int u,v;u = rnd()%n+1,v=rnd()%n+1;//cout << LCA(u,v) << endl;ans = (ans%mod+val[LCA(u,v)]%mod)%mod; }printf("%d",ans);return 0;
}

最小生成树(MST)相关三题相关推荐

  1. 计算机网络—时延相关真题练习(三)

    计算机网络-时延相关真题练习(三) 知识回顾: 第一题: 第二题: 第三题: 第四题: 第五题: 第六题:

  2. #2020.02.05训练题解#最小生成树入门(F题)

    题源CF-1108 CF-1108-MST Unification Description You are given an undirected weighted connected graph w ...

  3. 2020年人工神经网络第二次作业-参考答案第三题

    如下是 2020年人工神经网络第二次作业 中第三题的参考答案. ➤01 第三题参考答案 1.题目分析 本题实际上是课件中例题的重现问题. 对于7个字符(三种字体),21个训练样本,它们分别属于7大类. ...

  4. 蓝桥杯单片机十一届省赛_“第十届蓝桥杯青少组C++省赛”前三题解题思路及参考答案!...

    关注 及时了解信息学竞赛相关资讯 第十一届蓝桥杯青少组C++省赛即将到来,待考的各位小同学有没有刷完去年的真题呢?以下是为大家复习准备的"第十届蓝桥杯青少组C++省赛"前三题解题思 ...

  5. pmp每日三题(2022年3月15日)

    今日三题答案-CAD 1.在月度状态报告会上,发起人向项目经理询问有关可交付成果和预算制约因素的问题,而这些问题已经在每周的书面报告中进行回答和澄清.项目经理认为发起人并没有阅读附有每周报告的电子邮件 ...

  6. pmp每日三题(2022年3月14日)

    今日三题答案-BAA 1.由于项目执行期间的范围变更,项目经理确定供应商必须对一个已在使用的产品模块进行更改.项目经理首先做什么? A. 准备一份变更请求,以更新供应商的合同条款 B. 检查采购管理计 ...

  7. pmp每日三题(2022年3月10日)

    今日三题答案-DCC 1.项目经理已经完成了收集干系人的需求工作,并且必须在即将召开的指导委员会会议提交项目进度计划.在制定项目进度计划之前,项目经理应该做什么? A. 创建工作分解结构(WBS) B ...

  8. pmp每日三题(2022年3月4日)

    今日三题答案-BAC 1.项目合同规定了专业资源.在审查项目范围时,项目经理和承包商确定采购小组应选择工料合同(T&M),而不是固定总价(FFP)合同.项目经理应该怎么做? A.通知承包商合同 ...

  9. pmp每日三题(2022年3月2日)

    今日三题答案-CBB 1.在项目收尾过程中,项目经理得知他们必须快速加入一个更高优先级的项目.如果立即启动项目,这个新项目将为公司带来200万美元的增量价值.项目经理应该怎么做? A. 关闭所有风险并 ...

最新文章

  1. java 反射调用静态方法
  2. 使用Javascript制作连续滚动字幕
  3. 中年职场危机,这是我看过最靠谱的建议
  4. CSS 设计模式一 元素
  5. 04_NoSQL数据库之Redis数据库:set类型和zset类型
  6. js中的json ajax,js结合json实现ajax简单实例
  7. Java项目开发全流程实践
  8. Batch Normalization标准化(精)==>一方面可以简化计算过程,一方面经过规范化处理后让数据尽可能保留原始表达能力
  9. python图像识别坐标转换成g代码_python - 将坐标系导出为ESPG代码:to_epsg()或ExportToEPSG() - SO中文参考 - www.soinside.com...
  10. Oracle ERP Interface堵住--Request Running too long time,查找Request执行的Sql
  11. USB composite 设计
  12. 【Android -- 职业】职业规划
  13. 神秘的古文明 ———— 埃及文化
  14. 4 int、str类型(数据类型1)、type()
  15. 最新php版本下载地址
  16. 有关HTTP2.0详解
  17. 数据库 | ATACdb:一个全面的人类染色质可开放性数据库
  18. 【node.js】识别图片中的文字
  19. 【云原生】4.2 DevOps 精讲篇
  20. 基于asp.net319一嗨租车汽车租赁系统

热门文章

  1. 仿【得物】微信小程序实战全教程(动手就会)
  2. UVA - 10118Free Candies(记忆化搜索)
  3. python qt5 增加文本框_PyQt5 文本输入框自动补全 QLineEdit
  4. Python requests爬取淘宝商品信息
  5. ADS2017安装步骤
  6. AcWing 1117 单词接龙
  7. 【MySQL基础】什么是MySQL约束?什么是主键约束?
  8. 数学题还是计算机题啊
  9. HT单片机笔记1-时钟配置(2022/2/20)
  10. 播放视频无声音,视频编码来解决