HDU-2874-森林求LCA/tarjan
http://acm.hdu.edu.cn/showproblem.php?pid=2874
给出一个森林,询问任意两点最短距离。
tarjan跑一遍即可,就是这个题卡内存,vector会MLE,换前向星就好了。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<map>
- #include<set>
- #include<stack>
- #include<deque>
- #include<bitset>
- #include<unordered_map>
- #include<unordered_set>
- #include<queue>
- #include<cstdlib>
- #include<ctype.h>
- #include<ctime>
- #include<functional>
- #include<algorithm>
- #include<bits/stdc++.h>
- using namespace std;
- #define LL long long
- #define pii pair<int,int>
- #define mp make_pair
- #define pb push_back
- #define fi first
- #define se second
- #define inf 0x3f3f3f3f
- #define debug puts("debug")
- #define mid ((L+R)>>1)
- #define lc (id<<1)
- #define rc (id<<1|1)
- const int maxn=;
- const int maxm=;
- const double PI=acos(-1.0);
- const double eps=1e-;
- const LL mod=1e9+;
- LL gcd(LL a,LL b){return b==?a:gcd(b,a%b);}
- LL lcm(LL a,LL b){return a/gcd(a,b)*b;}
- LL qpow(LL a,LL b,LL c){LL r=; for(;b;b>>=,a=a*a%c)if(b&)r=r*a%c;return r;}
- template<class T>
- void prt(T v){for(auto x:v)cout<<x<<' ';cout<<endl;}
- struct Edge{int v,w,next;}e,e1[],e2[];
- int first1[maxn],first2[maxn],tot1,tot2;
- void add1(int u,int v,int w){
- e1[tot1].v=v;
- e1[tot1].w=w;
- e1[tot1].next=first1[u];
- first1[u]=tot1++;
- }
- void add2(int u,int v,int w){
- e2[tot2].v=v;
- e2[tot2].w=w;
- e2[tot2].next=first2[u];
- first2[u]=tot2++;
- }
- bool vis[maxn];
- int f[maxn],d[maxn],ans[];
- int getf(int u){return f[u]==u?u:f[u]=getf(f[u]);}
- void tarjan(int u){
- vis[u]=;
- for(int i=first1[u];~i;i=e1[i].next){
- e=e1[i];
- int v=e.v,w=e.w;
- if(!vis[v]){
- d[v]=d[u]+w;
- tarjan(v);
- f[v]=u;
- }
- }
- for(int i=first2[u];~i;i=e2[i].next){
- e=e2[i];
- int v=e.v,id=e.w;
- if(vis[v]){
- ans[id]=d[u]+d[v]-*d[getf(v)];
- }
- }
- }
- void read(int &n){
- n=; char c=getchar();
- while(c<''||c>'')c=getchar();
- while(c>=''&&c<='') n=(n<<)+(n<<)+c-'',c=getchar();
- }
- int main(){
- int t,n,m,i,j,u,v,w;
- while(~scanf("%d%d%d",&n,&m,&t)){
- for(i=;i<=n;++i)f[i]=i;
- tot1=tot2=;
- memset(first1,-,sizeof(first1));
- memset(first2,-,sizeof(first2));
- while(m--){
- //scanf("%d%d%d",&u,&v,&w);
- read(u),read(v),read(w);
- add1(u,v,w);
- add1(v,u,w);
- }
- for(i=;i<=t;++i){
- ans[i]=-;
- //scanf("%d%d",&u,&v);
- read(u),read(v);
- add2(u,v,i);
- add2(v,u,i);
- }
- memset(d,-,sizeof(d));
- for(i=;i<=n;++i){
- if(d[i]==-) d[i]=,memset(vis,,sizeof(vis)),tarjan(i);
- }
- for(i=;i<=t;++i){
- if(ans[i]==-) puts("Not connected");
- else printf("%d\n",ans[i]);
- }
- }
- return ;
- }
HDU-2874-森林求LCA/tarjan的更多相关文章
- Connections between cities HDU - 2874(最短路树 lca )
题意: 给出n个点m条边的图,c次询问 求询问中两个点间的最短距离. 解析: Floyd会T,所以用到了最短路树..具体思想为: 设k为u和v的最近公共祖先 d[i] 为祖结点到i的最短距离 则di ...
- Tarjan 算法求 LCA / Tarjan 算法求强连通分量
[时光蒸汽喵带你做专题]最近公共祖先 LCA (Lowest Common Ancestors)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili tarjan LCA - YouTube Tarj ...
- HDU 2874 Connections between cities(LCA Tarjan)
Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...
- 【HDOJ2586】【Tarjan离线求LCA】
http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) ...
- 倍增 Tarjan 求LCA
...
- hdu 2874 Connections between cities [LCA] (lca->rmq)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- 【Tarjan】洛谷P3379 Tarjan求LCA
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 倍增\ tarjan求lca
对于每个节点v,记录anc[v][k],表示从它向上走2k步后到达的节点(如果越过了根节点,那么anc[v][k]就是根节点). dfs函数对树进行的dfs,先求出anc[v][0],再利用anc[v ...
- Tarjan求LCA
LCA问题算是一类比较经典的树上的问题 做法比较多样 比如说暴力啊,倍增啊等等 今天在这里给大家讲一下tarjan算法! tarjan求LCA是一种稳定高速的算法 时间复杂度能做到预处理O(n + m ...
随机推荐
- Ubuntu fcitx CPU占用率很高解决方法
在Ubuntu中,有时候电脑的风扇突然狂装,用 pidstat -u 5 1 命令查看后台应用的资源占用情况,发现fcitx的占用率接近百分之百. 原因是搜狗云输入的问题,关闭后,在用kill命令干掉 ...
- HDU 1403 Longest Common Substring(最长公共子串)
http://acm.hdu.edu.cn/showproblem.php?pid=1403 题意:给出两个字符串,求最长公共子串的长度. 思路: 刚开始学后缀数组,确实感觉很难,但是这东西很强大,所 ...
- jqGrid API (转)
来源:https://www.cnblogs.com/MonaSong/p/5109991.html JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGr ...
- 网站项目所有js css无法引用问题解决方案
网站页面中的所有js css引用失效,路径确保正确,但是浏览器就是报找不到引用.仔细查找发现问题所在: 报错信息很详细了,就是.NET Framework 版本不同导致.同时也提供了两个解决方案:将. ...
- Systemd初始化进程/RHEL 6系统中System V init命令与RHEL 7系统中systemctl命令的对比
Linux操作系统的开机过程是这样的,即从BIOS开始,然后进入Boot Loader,再加载系统内核,然后内核进行初始化,最后启动初始化进程.初始化进程作为Linux系统的第一个进程,它需要完成Li ...
- PHP中封装Redis购物车功能
<?php // 服务层 namespace Common\Service; use Vendor\Func\Red; class CartService extends CommonServi ...
- <script src="../build/browser.min.js"></script> 是用来里面babel工具把ES6的语法转成ES5
<!DOCTYPE html> <html> <head> <script src="../build/react.js">< ...
- 如何备份MySQL数据库
在MySQL中进行数据备份的方法有两种: 1. mysqlhotcopy 这个命令会在拷贝文件之前会把表锁住,并把数据同步到数据文件中,以避免拷贝到不完整的数据文件,是最安全快捷的备份方法. 命令的使 ...
- d3 + geojson in node
d3.js本来主要是用于用“数据驱动dom”,在浏览器端,接收后端数据,数据绑定,渲染出svg. 即使是在ng中用,也是会由框架打包,供客户端下载. 那么,如果用所谓后端渲染,发布静态的svg,那就要 ...
- (转)Qt中图片相对位置的引用
原文作者:locky1218 原文地址:https://blog.csdn.net/locky1218/article/details/9749703/ 一般使用相对位置的时候可能无法显示图片,可 ...