UVALive 4960 Sensor network(MST+LCA)
来源:互联网 发布:武术软件 编辑:程序博客网 时间:2024/05/21 12:22
【题目】http://acm.hust.edu.cn/vjudge/problem/16412
【题意】给了N<=350个点的一个图,求所有的MST的最大边减去最小边的最大值。
【解题方法】这道题曾经有一个小数据版本,uva1395,那道题可以通过枚举最小边,算最小生成树,暴力算出最大减去最小的最大值。
这种复杂度在这里是n*m*m也就是到达n的五次方,所以这种方法是行不通的。现在丢出正解:对边排序后,一条一条的加边,成环了就删去环上的最小边。因为加进来的一定是最大边,减去新的最小边不断维护答案就可以了。
【正解参考blog】http://blog.csdn.net/lwt36/article/details/50597375
【AC 代码】效率还是很高的。
////Created by just_sort 2016/8/25//All rights Reserved//#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 355;const int maxm = 100010;const int inf = 0x3f3f3f3f;int n,m;int head[maxn],tot;struct edge{ int u,v,w; edge(){} edge(int u,int v,int w):u(u),v(v),w(w){} bool operator<(const edge &rhs) const{ return w<rhs.w; }}E[maxm];int dis[maxn][maxn],vis[maxn],fa[maxn],cnt;int lca(int u,int v){ memset(vis,false,sizeof(vis)); while(!vis[u] && u!=fa[u]) vis[u]=1,u=fa[u]; vis[u]=1; while(!vis[v] && v!=fa[v]) v=fa[v]; if(!vis[v]) return -1; return v;}void findcycle(int i){ int u=E[i].u,v=E[i].v; int _lca=lca(u,v); if(_lca==-1) return ; int fu=fa[u],minn=inf,mark=-1; while(u!=_lca && u!=fu) { if(dis[u][fu]<minn) minn=dis[u][fu],mark=u; u=fu; fu=fa[fu]; } int fv=fa[v]; while(v!=_lca&&v!=fv) { if(dis[v][fv]<minn) minn=dis[v][fv],mark=v; v=fv; fv=fa[fv]; } fa[mark]=mark; --cnt;}int tmp[maxn];void addedge(int i){ int u=E[i].u,v=E[i].v; if(u==fa[u]) fa[u]=v; else if(v==fa[v]) fa[v]=u; else { int cc=0; while(u!=fa[u]) tmp[++cc]=u,u=fa[u]; tmp[++cc]=u; for(int i=cc; i>1; i--) fa[tmp[i]]=tmp[i-1]; fa[E[i].u]=E[i].v; } ++cnt;}int solve(){ int res=inf;// for(int i=1; i<=n; i++)// {// printf("%d %d\n",i,fa[i]);// } for(int i=1; i<=n; i++) if(i!=fa[i]) res=min(res,dis[i][fa[i]]); return res;}int main(){ while(scanf("%d",&n)!=EOF&&n) { scanf("%d",&m); int u,v,c; for(int i=1; i<=m; i++) { scanf("%d%d%d",&u,&v,&c); ++u,++v; dis[u][v]=dis[v][u]=c; E[i]=edge(u,v,c); } sort(E+1,E+m+1); cnt=0; int ans=inf; for(int i=1; i<=n; i++) fa[i]=i; for(int i=1; i<=m; i++) { findcycle(i); addedge(i); int minedge=solve(); if(cnt==n-1) ans=min(ans,E[i].w-minedge); } printf("%d\n",ans); } return 0;}
0 0
- UVALive 4960Sensor network(MST+LCA)
- UVALive 4960 Sensor network(MST+LCA)
- UVALive - 4960 Sensor network(生成树+LCA)
- UVALive 6837There is No Alternative (MST + LCA)
- 【BZOJ3732】【MST】【LCA】Network 题解
- UVALive 6837 There is No Alternative (MST+暴力LCA)
- 文章标题 CSU 1845: Sensor network (暴力LCA+kruskal思想)
- uva12655 Trucks (MST + LCA)
- POJ 1861 Network(MST)
- UVA 11354 Bond(MST + LCA)
- UVA 11354Bond(MST+LCA)
- uva 12655 Trucks [LCA](树链剖分+MST)
- ZOJ 1586 QS Network (MST)
- PE 107 Minimal network (MST)
- uva 12275 - Sensor network(生成树)
- 【codevs1519】过路费 mst+lca
- UVALive 3887 Slim Span(枚举+MST,4级)
- UVA 11354 Bond(MST+LCA/二进制优化)
- BZOJ3590【状压DP】
- 寄存器间接寻址方式
- Luogu P1569 KC与龙珠 解题报告
- jsoup抓取页面与页面解析提取数据
- 多线程
- UVALive 4960 Sensor network(MST+LCA)
- 目标检测相关文章及源码
- Linux学习笔记3 常用shell命令
- Linux内核模块简介
- Ubuntu 14.04 64位安装 Google 的 Tensorflow
- 菜鸟学习maven的安装配置
- const.char类型形参与LPWSTR类型的实参不兼容
- unityCG库
- 有关tag值