【题意】

  给出N个点,M条边,问这N个点形成的生成树的最大权值边-最小权值边的最小值

Input
The input consists of several test cases, separated by single blank lines. Each test case begins with a
line containing the integer n (2 ≤ n ≤ 350), the number of doors in the building. The following line
contains another integer, m (n − 1 ≤ m ≤ n(n − 1)/2), the number of sensors in the network. The
test case finishes with m lines containing a description of each of the m sensors. The i-th of those lines
contains three integers, a (0 ≤ a ≤ n−1), b (0 ≤ b ≤ n−1) and w (1 ≤ w ≤ 2
15), in that order. Integers
a and b represent the pair of doors controlled by the i-th sensor, and w its recommended voltage. You
can safely assume that there are no two sensors controlling the same two doors.
The input will finish with a line containing ‘0’.
Output
For each case, your program should output a line containing the minimum margin of an admissible
subset of the sensors.
Sample Input
3
3
0 1 220
1 2 120
2 0 160
4
5
2 3 80
1 3 80
0 1 180
2 1 200
3 0 140
0
Sample Output
40
60

【分析】

  是Uva1395的进化版。

  数据范围大了一点点,不过之前的方法也是够慢的,m^2。

  总结来说,生成树问题其实就是有一棵最小生成树,然后你sm乱枚举一些东西,然后在最小生成树上搞啊搞。。【难道不是么??..

  最喜欢就是加一条边弄一个环然后在环上面又删一条边,就是没add边的时候两个点之间唯一路径上的边的权值求最值。

  这题就是这样啦。

  

  先排序,加边,考虑一下加下去的边是否会形成环,如果形成环的话,就把环内的最小边去掉(因为最长边就是现在ADD的那条边,如果要苗条就让边最小尽量大),然后重新求这棵新的生成树的最小边。等到生成树形成的时候,因为添加进去的新边的权值肯定是最大值的,所以只要只减去之前维护一个的最小值就可以了。

  然后,求路径最小边还有找最短边都是O(n)暴力的。

  总时间复杂度:O(nm)

  之前的方法复杂度是O(m^2),嗯,很多恶心题就是完全图,如果是完全图的话,这样的方法无疑是更优的。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define Maxn 410
#define INF 0xfffffff int n,m; struct node
{
int x,y,c;
}t[Maxn*Maxn]; bool cmp(node x,node y) {return x.c<y.c;}
int mymin(int x,int y) {return x<y?x:y;} int fa[Maxn]; bool vis[Maxn];
int get_lca(int now)
{
int x=t[now].x,y=t[now].y,ans=;
for(int i=;i<=n;i++) vis[i]=;
while(x!=fa[x]) vis[x]=,x=fa[x]; vis[x]=;
while(y!=fa[y])
{
if(vis[y]) {ans=y;break;}
y=fa[y];
}
if(ans==&&vis[y]) ans=y;
// while(x!=fa[x]) vis[x]=0,x=fa[x]; vis[x]=0;
return ans;
} int dis[Maxn],mn,cnt;
void ffind(int now)
{
int x=t[now].x,y=t[now].y;
// if(fa[x]!=fa[y]) return;
int lca=get_lca(now);
if(lca==) return;
int k=INF,kv;
while(x!=lca)
{
if(dis[x]<k)
{
k=dis[x];
kv=x;
}
x=fa[x];
}
while(y!=lca)
{
if(dis[y]<k)
{
k=dis[y];
kv=y;
}
y=fa[y];
}
fa[kv]=kv,dis[kv]=;
mn=INF;
for(int i=;i<=n;i++) if(fa[i]!=i)
{
mn=mymin(mn,dis[i]);
}
cnt--;
} void add(int now)
{
int x=t[now].x,y=t[now].y,c=t[now].c;
if(fa[x]==fa[y]) return;
if(fa[x]==x) fa[x]=y,dis[x]=c;
else if(fa[y]==y) fa[y]=x,dis[y]=c;
else
{
int xx=x,u=fa[x],dd=dis[x];
while(x!=u)
{
int nu=fa[u],nd=dis[u];
fa[u]=x;
dis[u]=dd;
x=u;u=nu;dd=nd;
}
fa[xx]=y;dis[xx]=c;
}
mn=mymin(mn,c);
cnt++;
} int main()
{
while()
{
scanf("%d",&n);
if(n==) break;
scanf("%d",&m);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&t[i].x,&t[i].y,&t[i].c);
t[i].x++;t[i].y++;
}
sort(t+,t++m,cmp);
cnt=;
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++) fa[i]=i;
mn=INF;
memset(dis,,sizeof(dis));
int ans=INF;
for(int i=;i<=m;i++)
{
ffind(i);
add(i);
if(cnt==n-) ans=mymin(ans,t[i].c-mn);
}
printf("%d\n",ans);
}
return ;
}

WC这题代码把LA3887 A了!!!!

2016-11-02 09:52:33

--------------------------------------------------------------------------

突然发现这题是删边模版?

【Uvalive4960】 Sensor network (苗条树,进化版)的更多相关文章

  1. 【转】线段树完全版~by NotOnlySuccess

    线段树完全版  ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...

  2. 布拉格捷克理工大学研究团队:Prisma进化版

    原文链接  还记得 Prisma 吗?就是能把拍摄的照片转化为各种名画风格的修图软件,神经网络的深度学习后,想要波普还是梵高风的图片都不在话下. 现在,它的进化版本来了.这回是布拉格捷克理工大学的研究 ...

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

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

  4. 从零開始学Swift之Hello World进化版

    上节课,也就是昨晚啦,我们学习到从零開始学Swift之Hello World.那一节仅仅有一句代码,大家会认为不够过瘾. 那么这节课,就给大家来多点瘾货吧! 先上图! //var 代表变量的类型, s ...

  5. B树的进化版----B+树

    C++为什么叫C plus plus?这是由于C++相当于继承C的语法后,增加了各方面的能力,所扩展出的一种新语法.在软件领域中 plus 有增加的味道.在这里B +树也一样,是B树的增强版.在学习B ...

  6. HDU 4287 Intelligent IME(字典树数组版)

    Intelligent IME Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点

    J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...

  8. 【转】 线段树完全版 ~by NotOnlySuccess

    载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章 ...

  9. POJ 3659 Cell Phone Network(树的最小支配集)(贪心)

    Cell Phone Network Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6781   Accepted: 242 ...

随机推荐

  1. pcap支持Python2.7.8解决办法

    pcap库只支持到python2.5. pip install pcap在python2.7.8找不到. 只需要将网盘的2个文件放到python安装目录下lib/site-package文件夹即可 链 ...

  2. js 注册手机摇动事件

    var rockModule = (function () { //监听手机摇动事件 if (window.DeviceMotionEvent) { window.addEventListener(' ...

  3. wampserver修改mysql密码后phpmyadmin登陆错误处理方法

    首先针对wampserver这个软件来说,是很方面的! 在进行使用时都会涉及到关于mysql数据管理系统的相关密码的修改,这个当然修改是很简单,当时没有想那么多,想为自己的mysql添加一个密码,方式 ...

  4. 前后端分离 接口管理神器——Rap本地搭建

    我这里要用做mockserver的就是rap了,rap结合了团队管理,项目管理,文档编写.Mock.js.可视化.接口过渡.文档历史版本(赞).mock插件(线上线下切换就只需要注释一句代码就OK), ...

  5. 将分页功能从JSP页面中独立出来

    附带视频链接:http://www.tudou.com/programs/view/leaQ-YFl7W8/?bid=03&pid=2&resourceId=0_03_05_02

  6. 关于MD5校验和java工程下的校验

    File file = new File("cos_code2003.bin"); System.out.println(file.length()); byte[] data = ...

  7. ASP.NET问题处理---“数据请求超时错误“”

    数据请求超时,一般有2中解决方式: 1.页面AJAX处理数据时延长时间: 2.后台数据库连接取数据时延长时间. 由于我的后台数据库连接取数据为循环读取数据,所以不存在超时问题,这里具体说说如何修改AJ ...

  8. MVC小系列(九)【引入namespace】

    以前在页面引入一个namespace,可以这样: <%@ Import Namespace="Web.Helpers" %> 如果空间是所有页面都需要的,可以写进配置文 ...

  9. ios NSHashTable & NSMapTable

    在ios开发中大家用到更多的集合类可能是像NSSet或者NSDictionary,NSArray这样的.这里要介绍的是更少人使用的两个类,一个是NSMapTable,另一个是NSHashTable. ...

  10. linux命令行执行db2存储过程

    存储过程代码如下: CREATE PROCEDURE proc_sum2(IN n INT,OUT sum INT,OUT j INT) BEGIN DECLARE i INT; ; ; ; WHIL ...