3732: Network

题目:传送门


题解:

   第一眼就看到最大边最小,直接一波最小生成树。

   一开始还担心会错,问了一波肉大佬,任意两点在最小生成树上的路径最大边一定是最小的。

   那么事情就变得简单起来了嘿嘿嘿,建棵树,直接在线LCA啊,用一个mx[i][j]记录i往上2^j这段区间的最大值。


代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
int x,y,c;
}a[];int len;
void ins(int x,int y,int c)
{
len++;a[len].x=x;a[len].y=y;a[len].c=c;
}
struct edge
{
int x,y,c,next;
}e[];int llen,last[];
void inss(int x,int y,int c)
{
llen++;e[llen].x=x;e[llen].y=y;e[llen].c=c;
e[llen].next=last[x];last[x]=llen;
}
int fa[];
int findfa(int x){if(fa[x]!=x)fa[x]=findfa(fa[x]);return fa[x];}
bool cmp(node n1,node n2){return n1.c<n2.c;}
int n,m,T;
int bin[],dep[],f[][];
int mx[][];//记录i~i+2^j的最大边值
void pre_tree_node(int x)
{
for(int i=;i<= && dep[x]>=bin[i];i++)
f[x][i]=f[f[x][i-]][i-],mx[x][i]=max(mx[x][i-],mx[f[x][i-]][i-]);
for(int k=last[x];k;k=e[k].next)
{
int y=e[k].y;
if(y!=f[x][])
{
dep[y]=dep[x]+;
f[y][]=x;mx[y][]=e[k].c;
pre_tree_node(y);
}
}
}
int sol(int x,int y)
{
int maxx=;
if(dep[x]<dep[y])swap(x,y);
for(int i=;i>=;i--)
if(dep[x]-dep[y]>=bin[i])
maxx=max(maxx,mx[x][i]),x=f[x][i];
if(x==y)return maxx;
for(int i=;i>=;i--)
if(dep[x]>=bin[i] && f[x][i]!=f[y][i])
maxx=max(maxx,max(mx[x][i],mx[y][i])),x=f[x][i],y=f[y][i];
maxx=max(maxx,max(mx[x][],mx[y][]));
return maxx;
}
int main()
{
bin[]=;for(int i=;i<=;i++)bin[i]=bin[i-]<<;
scanf("%d%d%d",&n,&m,&T);
llen=len=;memset(last,,sizeof(last));
for(int i=;i<=m;i++)
{
int x,y,c;scanf("%d%d%d",&x,&y,&c);
ins(x,y,c);ins(y,x,c);
}
sort(a+,a+len+,cmp);
for(int i=;i<=n;i++)fa[i]=i;int tt=;
for(int i=;i<=len;i++)
{
int fx=findfa(a[i].x),fy=findfa(a[i].y);
if(fx!=fy)
{
fa[fy]=fx,tt++;
inss(a[i].x,a[i].y,a[i].c);
inss(a[i].y,a[i].x,a[i].c);
if(tt==n-)break;
}
}
for(int i=;i<=n;i++)
if(fa[i]==i)
f[i][]=,dep[i]=,pre_tree_node(i);
while(T--)
{
int st,ed;scanf("%d%d",&st,&ed);
printf("%d\n",sol(st,ed));
}
return ;
}

最新文章

  1. shell脚本俄罗斯方块游戏
  2. [Java入门笔记] 面向对象三大特征之:继承
  3. Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践
  4. Windows性能监视器之CPU、硬盘、IO等监控方法详解-摘自网络
  5. Hadoop datanode无法启动的错误
  6. 记录一次centos升级gblic的教训
  7. freebsd安装和图形界面安装
  8. 使用 Spark MLlib 做 K-means 聚类分析[转]
  9. Codeforce#354_B_Pyramid of Glasses(模拟)
  10. 利用DNS AAAA记录和IPv6地址传输后门
  11. Windows 7 蓝屏原因
  12. input type=&quot;file&quot;指定文件类型为excel
  13. RxJava 2.x 使用最佳实践
  14. TCP报文格式
  15. 46-2016 蓝桥杯 java B 组
  16. KEIL中函数定义存在但go to definition却不跳转的原因
  17. centos安装Django之三:安装python
  18. HDU - 4436sam裸题
  19. P2P Downloader
  20. python you-get 下载视频

热门文章

  1. 2015.05.15,外语,学习笔记-《Word Power Made Easy》 01 “如何讨论人格特点”
  2. java old GC和young GC
  3. hdoj--2522--A simple problem(数学模拟)
  4. ubuntu软件卸载方法
  5. 基于Redis实现分布式应用限流--转
  6. Java对象、Json、Xml转换工具Jackson使用
  7. 列表查询组件代码, 简化拼接条件SQL语句的麻烦
  8. deploy sql clr
  9. Pyhton学习——Day27
  10. js 时间戳 中国标准时间 年月日 日期之间的转换