解题思路:Tarjan离线处理

一篇介绍LCA的很好的博客:http://www.cppblog.com/menjitianya/archive/2015/12/10/212447.html

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int maxn = 10005;
struct Edge
{int k,next,cost;
}edge[maxn<<1];
struct Ask
{int k,next,id;
}ask[maxn<<1];
int n,m,c,cnt1,cnt2,pre[maxn],head[maxn];
int color[maxn],ans[maxn],dis[maxn],fa[maxn];
bool vis[maxn];int find(int x)
{if(fa[x] == x) return x;else return fa[x] = find(fa[x]);
}void addedge(int u,int v,int cost)
{edge[cnt1].k = v;edge[cnt1].cost = cost;edge[cnt1].next = pre[u];pre[u] = cnt1++;
}void addask(int u,int v,int id)
{ask[cnt2].id = id;ask[cnt2].k = v;ask[cnt2].next = head[u];head[u] = cnt2++;
}void Tarjan(int u,int root,int len)
{vis[u] = true;fa[u] = u;dis[u] = len;for(int i = pre[u]; i != -1; i = edge[i].next){int v = edge[i].k;if(vis[v]) continue;Tarjan(v,root,len + edge[i].cost);fa[v] = u;}color[u] = root;for(int i = head[u]; i != -1; i = ask[i].next){int v = ask[i].k;if(color[v] == root){int ancestor = find(v);ans[ask[i].id] = dis[u] + dis[v] - 2*dis[ancestor];}}
}int main()
{int u,v,cost;while(scanf("%d%d%d",&n,&m,&c)!=EOF){memset(pre,-1,sizeof(pre));memset(head,-1,sizeof(head));cnt1 = cnt2 = 0;for(int i = 1; i <= m; i++){scanf("%d%d%d",&u,&v,&cost);addedge(u,v,cost);addedge(v,u,cost);}for(int i = 1; i <= c; i++){scanf("%d%d",&u,&v);addask(u,v,i);addask(v,u,i);}memset(vis,false,sizeof(vis));memset(color,0,sizeof(color));memset(ans,-1,sizeof(ans));for(int i = 1; i <= n; i++)if(vis[i] == false)Tarjan(i,i,0);for(int i = 1; i <= c; i++){if(ans[i] == -1)printf("Not connected\n");else printf("%d\n",ans[i]);}}return 0;
}

hdu 2874(LCA + 节点间距离)相关推荐

  1. hdu 2586(LCA + 节点间距离)

    题意:给一棵树,询问u和v之间的边权和. 解题思路:找到u和v的最近公共祖先,它们之间的距离为dis[u]+dis[v]-2*dis[lca(u,v)] #include<iostream> ...

  2. 【IT笔试面试题整理】 二叉树任意两个节点间最大距离

    求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数, 比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度. 一种是:经过根节点,此时只 ...

  3. 【数据挖掘】基于层次的聚类方法 ( 聚合层次聚类 | 划分层次聚类 | 族间距离 | 最小距离 | 最大距离 | 中心距离 | 平均距离 | 基于层次聚类步骤 | 族半径 )

    文章目录 基于层次的聚类方法 简介 基于层次的聚类方法 概念 聚合层次聚类 图示 划分层次聚类 图示 基于层次的聚类方法 切割点选取 族间距离 概念 族间距离 使用到的变量 族间距离 最小距离 族间距 ...

  4. 二叉树节点间的最大距离问题

    二叉树节点间的最大距离问题 从二叉树的节点 A 出发,可以向上或者向下走,但沿途的节点只能经过一次,当到达节点 B 时,路 径上的节点数叫作 A 到 B 的距离.求整棵树上节点间的最大距离. 如果二叉 ...

  5. hdu 2586(LCA的离线做法)

    lca上的tarjan,改了我一下午加一晚上的bug,还无奈重写了一次.就是寻找最近公共祖先lca(u,v #include <iostream> #include <cstring ...

  6. 《程序员代码面试指南》第三章 二叉树问题 二叉树节点间的最大距离问题

    题目 二叉树节点间的最大距离问题 java代码 package com.lizhouwei.chapter3;/*** @Description:二叉树节点间的最大距离问题* @Author: liz ...

  7. 层次聚类定义、层次聚类过程可视化、簇间距离度量、BIRCH、两步聚类、BIRCH算法优缺点

    层次聚类定义.层次聚类过程可视化.簇间距离度量.BIRCH.两步聚类.BIRCH算法优缺点 目录

  8. abovedisplayskip无效_latex减少图片和图片解释文字之间的距离、调整公式与正文间距离,调整空白大小:...

    LaTex图片之间的间隔设置说白了就是对水平方向上间隔的设置,用到的命令: \hspace{bcm} "b"可正可负,正数扩大间距,负数缩小间距.问题解决. Latex调整图片与上 ...

  9. 如何在NEO共识节点间分配任务

    作者:Alexey Vanin 任何计算机系统都有监控操作,可能会发送心跳信息.校验和查询及哈希请求等.这些操作在本文中都被统称为任务.在中心化系统中,通常会有一个受认证的节点或节点群组来完成任务.而 ...

最新文章

  1. PetShop的系统架构设计[转]
  2. git push代码到远程新分支
  3. 倒影问题(reflect:below)
  4. linux lcd显示流程,求助 armlinux中实现lcd显示
  5. Linux 下的帮助命令
  6. python读压缩文件内容_Python读写压缩文件的方法
  7. 微软:SolarWinds 黑客的目标是受害者的云数据
  8. SpringBoot集成dubbo实例
  9. bim 骗局_来自建筑行业的BIM骗局
  10. Android IOS视频录制技术方案
  11. 软考中级考试信息系统管理工程师怎么样??
  12. oracle中给予权限,Oracle给予用户权限
  13. amc 美国数学竞赛能用计算机吗,美国数学竞赛AMC的三种级别
  14. 如何在Win10系统下的IntelliJ IDEA 2018.3.5下载与安装以及激活教程
  15. SSH框架 Bean property * is not writable or has an invalid setter method错误分析与解决方法
  16. 开闭原则的例子_开闭原则
  17. 十万部冷知识:足球赛中进三个球为什么叫帽子戏法?
  18. hypermill 海德汉五轴联动3+2后处理制作视频教程
  19. 养猫日记-20200423
  20. CCTV3《回声嘹亮——西游记重…

热门文章

  1. 推荐一款好用的redis客户端工具
  2. Excel关于使用图形的妙招技法
  3. 期初付年金(annuity-due)
  4. Qt之布局管理——堆栈窗体
  5. XML 解析错误:XML 或文本声明不在实体的开头位置,有效的解决方法
  6. 【springmvc+mybatis项目实战】杰信商贸-6.重点知识回顾
  7. Reporting Services系列五:WebService接口
  8. factors to consider about the publications
  9. Engineering Department Bulletin News and information for the Department
  10. teacher want middle point result rather all drafts