题目大意:给出N个点。M条边。问这N个点形成的生成树的最大权值边-最小权值边的最小值

解题思路:先排序,然后按生成树的kruscal算法进行加边,再维护一个最小权值边

加边的时候要考虑一下加下去的边是否会形成环,假设形成环的话,就把环内的最小边去掉,然后再找出这棵新的生成树的最小边

等到生成树形成的时候,由于加入进去的新边的权值肯定是最大值的,所以仅仅要仅仅减去之前维护一个的最小值就能够了

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; #define N 400
#define M 160010
#define INF 0x3f3f3f3f struct Edge{
int u, v, c;
Edge() {}
Edge(int u, int v, int c): u(u), v(v), c(c) {}
}E[M]; int f[N], dis[N][N];
int cnt, Min_Edge, n, m;
bool vis[N]; int cmp(const Edge &a, const Edge &b) {
return a.c < b.c;
} void init() {
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].c);
dis[E[i].u][E[i].v] = dis[E[i].v][E[i].u] = E[i].c;
}
} int LCA(int i) {
int u = E[i].u, v = E[i].v, c = E[i].c;
memset(vis, 0, sizeof(vis));
while (!vis[u]) {
vis[u] = true;
if (u == f[u]) break;
u = f[u];
} while (!vis[v] && f[v] != v) v = f[v];
if (!vis[v]) return -1;
return v;
} void findCycle(int i) {
int lca = LCA(i);
if (lca == -1) return ;
int u = E[i].u, v = E[i].v, c = E[i].c;
Edge MinEdge;
MinEdge.c = INF;
int fu = f[u];
while (fu != u && u != lca) {
if (dis[fu][u] < MinEdge.c) MinEdge = Edge(fu, u, dis[fu][u]); fu = f[fu];
u = f[u]; } int fv = f[v];
while (fv != v && v != lca) {
if (dis[fv][v] < MinEdge.c) MinEdge = Edge(fv, v, dis[fv][v]);
fv = f[fv];
v = f[v];
} f[MinEdge.v] = MinEdge.v;
Min_Edge = INF;
for (int i = 0; i < n; i++)
if (f[i] != i && dis[f[i]][i] < Min_Edge)
Min_Edge = dis[f[i]][i];
cnt--;
} void AddEdge(int i) {
int u = E[i].u, v = E[i].v, c = E[i].c;
if (f[u] == u) f[u] = v;
else if (f[v] == v) f[v] = u;
else {
vector<int> vec;
while (1) {
vec.push_back(u);
if (u == f[u]) break;
u = f[u];
}
int size = vec.size();
for (int i = size - 1; i > 0; i--) f[vec[i]] = vec[i - 1];
f[E[i].u] = E[i].v;
}
Min_Edge = min(Min_Edge, c);
cnt++;
} void solve() {
sort(E, E + m, cmp);
for (int i = 0; i < n; i++)
f[i] = i; int ans = INF;
Min_Edge = INF;
cnt = 0;
for (int i = 0; i < m; i++) {
findCycle(i);
AddEdge(i);
if (cnt == n - 1) ans = min(ans, E[i].c - Min_Edge); }
printf("%d\n", ans);
} int main() {
while (scanf("%d", &n) != EOF && n) {
scanf("%d", &m);
init();
solve();
}
return 0;
}

UVALive - 4960 Sensor network(生成树+LCA)的更多相关文章

  1. uvalive 4960 Sensor Network

    题意: 给出一个无向图,求一个生成树使得这个生成树的最大边与最小边之差最小,输出这个最小的差值.n的最大值为350. 思路: 这题不看题解想破头也不知道怎么写Orz. 暴力的做法是可以从大到小枚举边作 ...

  2. 【暑假】[实用数据结构]UVAlive 3027 Corporative Network

    UVAlive 3027 Corporative Network 题目:   Corporative Network Time Limit: 3000MS   Memory Limit: 30000K ...

  3. POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Network / FZU 1161 (网络流,最大流)

    POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Networ ...

  4. 【BZOJ4080】【WF2014】Sensor Network [随机化]

    Sensor Network Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 魔法炮来到了帝都 ...

  5. poj 3417 Network(tarjan lca)

    poj 3417 Network(tarjan lca) 先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂. 我们设 ...

  6. 【Uvalive4960】 Sensor network (苗条树,进化版)

    [题意] 给出N个点,M条边,问这N个点形成的生成树的最大权值边-最小权值边的最小值 InputThe input consists of several test cases, separated ...

  7. bzoj3322 最大生成树+LCA

    题目大意:给个无向图,每条边有个限制,每个点最多能买入和卖出一定黄金:然后按顺序走过n个点,求每个卖出黄金的点最多能卖出多少黄金 一开始有点懵,想着怎么再图上做这个问题,后来知道要先建一棵最大生成树 ...

  8. ACM-ICPC 2018 徐州赛区网络预赛 J Maze Designer(最大生成树+LCA)

    https://nanti.jisuanke.com/t/31462 题意 一个N*M的矩形,每个格点到其邻近点的边有其权值,需要构建出一个迷宫,使得构建迷宫的边权之和最小,之后Q次查询,每次给出两点 ...

  9. 最大生成树——LCA

    今天说是要练习LCA结果找了道题看着题解打完了,如此惭愧,Lca还得好好理解啊,感觉在最大生成树上做有点异样,可能还是不是很理解吧,在noip前一定要再把这道题再a一遍,好题啊. 这是2013noip ...

随机推荐

  1. 负载均衡之lvs

    集群(cluster):将一组计算机软/硬件连接起来,高度紧密的协作完成计算工作,其中的单个计算机通常称为节点.负载均衡集群(Load Balancing):通过负载均衡器,将负载尽可能平均分摊处理. ...

  2. 谈一谈Nginx的强大

    什么是Nginx? Nginx是一款高性能,开源的,支持高并发而轻量级的Web服务器,同时也是具有反向代理服务器及电子邮件(IMAP/POP3)的代理服务器. 基于REST架构风格,并且以统一资源描述 ...

  3. ln用法

    第一部分: 建立简单的硬连接: ln ./wwy.gif ./wwy_ln (第二个参数为新建的连接文件,建立前不存在),则任意一个文件变化,另一个也变化:大小为一个文件的大小:硬连接只能建在同一个分 ...

  4. 分组的listview——ExpandableListView

    开发使用到的数据统计时可以用分组的ExpandablelistView 效果:

  5. 7.Node.js 创建第一个应用

    转自:http://www.runoob.com/nodejs/nodejs-tutorial.html 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器, ...

  6. Error: org.apache.mahout.math.CardinalityException: Required cardinality 10 but got 30问题解决办法

    问题详情 在运行mahout中kmeans算法时,采取的是其默认输入路径/user/hadoop/testdata 和 默认输出路径/user/hadoop/output. [hadoop@djt00 ...

  7. Day2二分图笔记

    定义 左边一堆点 右边一堆点 树是一个二分图,奇数深度和偶数深度可以组成二分图, 二分图匹配 左边的点和右边的点有边 匈牙利算法 可能的答案 ans,n-ans,m-ans,n+m-ans  ||   ...

  8. HDU 多校联合 6045

    Is Derek lying? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  9. 获取DOM元素到页面顶部的距离,亲测有效版本(转载)

    原文:https://blog.csdn.net/u013764814/article/details/83825479 干脆点(博客就应该干脆,少扯皮) DOM元素有一个属性是offsetTop,表 ...

  10. 【hdu 4333】Revolving Digits

    [链接]http://acm.hdu.edu.cn/showproblem.php?pid=4333 [题意] 就是给你一个数字,然后把最后一个数字放到最前面去,经过几次变换后又回到原数字,问在这些数 ...