HDU 3686 Traffic Real Time Query System(双连通分量缩点+LCA)(2010 Asia Hangzhou Regional Contest)
For each test case:
The first line contains two integers N and M, representing the number of the crossings and roads.
The next M lines describe the roads. In those M lines, the ith line (i starts from 1)contains two integers Xi and Yi, representing that roadi connects crossing Xi and Yi (Xi≠Yi).
The following line contains a single integer Q, representing the number of RTQs.
Then Q lines follows, each describing a RTQ by two integers S and T(S≠T) meaning that a driver is now driving on the roads and he wants to reach roadt . It will be always at least one way from roads to roadt.
The input ends with a line of “0 0”.
Please note that: 0<N<=10000, 0<M<=100000, 0<Q<=10000, 0<Xi,Yi<=N, 0<S,T<=M
- #include <cstdio>
- #include <iostream>
- #include <algorithm>
- #include <cstring>
- #include <vector>
- using namespace std;
- typedef long long LL;
- typedef pair<int, int> PII;
- const int MAXV = ;
- const int MAXE = ;
- int ans[MAXV];
- vector<PII> query[MAXV << ];
- struct SccGraph {
- int head[MAXV << ], fa[MAXV << ], ecnt;
- bool vis[MAXV << ];
- int to[MAXE << ], next[MAXE << ];
- int dep[MAXV << ];
- void init(int n) {
- memset(head, -, sizeof(int) * (n + ));
- memset(vis, , sizeof(bool) * (n + ));
- for(int i = ; i <= n; ++i) fa[i] = i;
- ecnt = ;
- }
- int find_set(int x) {
- return fa[x] == x ? x : fa[x] = find_set(fa[x]);
- }
- void add_edge(int u, int v) {
- to[ecnt] = v; next[ecnt] = head[u]; head[u] = ecnt++;
- to[ecnt] = u; next[ecnt] = head[v]; head[v] = ecnt++;
- }
- void lca(int u, int f, int deep) {
- dep[u] = deep;
- for(int p = head[u]; ~p; p = next[p]) {
- int &v = to[p];
- if(v == f || vis[v]) continue;
- lca(v, u, deep + );
- fa[v] = u;
- }
- vis[u] = true;
- for(vector<PII>::iterator it = query[u].begin(); it != query[u].end(); ++it) {
- if(vis[it->first]) {
- ans[it->second] = (dep[u] + dep[it->first] - * dep[find_set(it->first)]) / ;
- }
- }
- }
- } G;
- int head[MAXV], lowlink[MAXV], pre[MAXV], ecnt, dfs_clock;
- int sccno[MAXV], scc_cnt;
- int to[MAXE], next[MAXE], scc_edge[MAXE];
- bool vis[MAXE], iscut[MAXV];
- int stk[MAXE], top;
- int n, m, q;
- void init() {
- memset(head, -, sizeof(int) * (n + ));
- memset(pre, , sizeof(int) * (n + ));
- memset(iscut, , sizeof(bool) * (n + ));
- memset(vis, , sizeof(bool) * ( * m));
- ecnt = scc_cnt = dfs_clock = ;
- }
- void add_edge(int u, int v) {
- to[ecnt] = v; next[ecnt] = head[u]; head[u] = ecnt++;
- to[ecnt] = u; next[ecnt] = head[v]; head[v] = ecnt++;
- }
- void tarjan(int u, int f) {
- pre[u] = lowlink[u] = ++dfs_clock;
- int child = ;
- for(int p = head[u]; ~p; p = next[p]) {
- if(vis[p]) continue;
- vis[p] = vis[p ^ ] = true;
- stk[++top] = p;
- int &v = to[p];
- if(!pre[v]) {
- ++child;
- tarjan(v, u);
- lowlink[u] = min(lowlink[u], lowlink[v]);\
- if(pre[u] <= lowlink[v]) {
- iscut[u] = true;
- ++scc_cnt;
- while(true) {
- int t = stk[top--];
- scc_edge[t] = scc_edge[t ^ ] = scc_cnt;
- if(t == p) break;
- }
- }
- } else lowlink[u] = min(lowlink[u], pre[v]);
- }
- if(f < && child == ) iscut[u] = false;
- }
- void build() {
- G.init(scc_cnt);
- for(int p = ; p != ecnt; ++p) {
- int &v = to[p];
- if(iscut[v]) G.add_edge(sccno[v], scc_edge[p]);
- }
- }
- void solve() {
- for(int i = ; i <= n; ++i)
- if(!pre[i]) tarjan(i, );
- for(int u = ; u <= n; ++u)
- if(iscut[u]) sccno[u] = ++scc_cnt;
- }
- int main() {
- while(scanf("%d%d", &n, &m) != EOF) {
- if(n == && m == ) break;
- init();
- for(int i = ; i <= m; ++i) {
- int u, v;
- scanf("%d%d", &u, &v);
- add_edge(u, v);
- }
- solve();
- build();
- for(int i = ; i <= scc_cnt; ++i) query[i].clear();
- scanf("%d", &q);
- for(int i = ; i < q; ++i) {
- int x, y;
- scanf("%d%d", &x, &y);
- x = scc_edge[x * - ]; y = scc_edge[y * - ];
- query[x].push_back(make_pair(y, i));
- query[y].push_back(make_pair(x, i));
- }
- for(int i = ; i <= scc_cnt; ++i) if(!G.vis[i]) G.lca(i, , );
- for(int i = ; i < q; ++i) printf("%d\n", ans[i]);
- }
- }
HDU 3686 Traffic Real Time Query System(双连通分量缩点+LCA)(2010 Asia Hangzhou Regional Contest)的更多相关文章
- HDU 3686 Traffic Real Time Query System (图论)
HDU 3686 Traffic Real Time Query System 题目大意 给一个N个点M条边的无向图,然后有Q个询问X,Y,问第X边到第Y边必需要经过的点有多少个. solution ...
- hdu 3686 Traffic Real Time Query System 点双两通分量 + LCA。这题有重边!!!
http://acm.hdu.edu.cn/showproblem.php?pid=3686 我要把这题记录下来. 一直wa. 自己生成数据都是AC的.现在还是wa.留坑. 我感觉我现在倒下去床上就能 ...
- HDU 3686 Traffic Real Time Query System(点双连通)
题意 给定一张 \(n\) 个点 \(m\) 条边的无向图,\(q\) 次询问,每次询问两边之间的必经之点个数. 思路 求两点之间必经之边的个数用的是边双缩点,再求树上距离.而对比边双和点双之 ...
- HDU 3685 Rotational Painting(多边形质心+凸包)(2010 Asia Hangzhou Regional Contest)
Problem Description Josh Lyman is a gifted painter. One of his great works is a glass painting. He c ...
- HDU 3689 Infinite monkey theorem(DP+trie+自动机)(2010 Asia Hangzhou Regional Contest)
Description Could you imaging a monkey writing computer programs? Surely monkeys are smart among ani ...
- 【HDOJ】3686 Traffic Real Time Query System
这题做了几个小时,基本思路肯定是求两点路径中的割点数目,思路是tarjan缩点,然后以割点和连通块作为新节点见图.转化为lca求解.结合点——双连通分量与LCA. /* 3686 */ #includ ...
- POJ3694 Network(边双连通分量+缩点+LCA)
题目大概是给一张图,动态加边动态求割边数. 本想着求出边双连通分量后缩点,然后构成的树用树链剖分+线段树去维护路径上的边数和..好像好难写.. 看了别人的解法,这题有更简单的算法: 在任意两点添边,那 ...
- 图论-桥/割点/双连通分量/缩点/LCA
基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...
- 【Targan+LCA】HDU 3686 Traffic Real Time Query
题目内容 洛谷链接 给出一个\(n\)个节点,\(m\)条边的无向图和两个节点\(s\)和\(t\),问这两个节点的路径中有几个点必须经过. 输入格式 第一行是\(n\)和\(m\). 接下来\(m\ ...
随机推荐
- td的cellIndex属性被style.display改变
IE7下面td的cellIndex属性,居然会随着style.display='none'的设置而改变,真是太恶心了
- ADO.NET连接到数据库(oracle)
本文摘抄于http://www.cnblogs.com/luluping/archive/2009/10/13/1582737.html,如有侵权,请联系博主. OracleConnection 对象 ...
- sqlserver 中含有某字符串
查找 sqlserver 中字符串的ascii码SET TEXTSIZE 0-- Create variables for the character string and for the curre ...
- swift-03-构造器(Designated&&Convenience)
类里面所有的存储型属性--包括所有继承自父类的属性,都必须在构造过程中设置初始值. 构造器,为了确保所有类实例中的存储型属性都能获得初始值,设置了两个构造器--他们分别是指定构造器和便利构造器. ...
- Windows-004-显示文件的扩展名
此文主要讲述 Windows 7 下如何显示文件的扩展名,敬请亲们参阅.若有不足之处,敬请大神指正,不胜感激! 通常安装好 Win7 后,文件的扩展名默认是不显示的,如下所示: 点击工具栏中的 组织, ...
- boost::circular_buffer
boost::circular_buffer的push_back分析 circular_buffer为了效率考虑,使用了连续内存块保存元素 使用固定内存,没有隐式或者非期望的内存分配 快速在cir ...
- CentOS6.7搭建蜜罐dionaea
yum -y install epel-release wget tar git autoconf* libtool-* mkdir /opt/dionaea 1.安装liblcfg软件.git cl ...
- 30天,APP创业从0到1【7.25上海站】
活动概况 时间:2015年7月25日13:30-16:30 地点:太库•上海孵化器(张江金科路2889号长泰广场c座12楼) 主办:APICloud.诸葛.圣诺资讯 联合主办:微链.太库•上海孵化器 ...
- system执行shell命令
system - execute a shell command #include <stdlib.h> int system (const char *command); 描述 syst ...
- Vue.2.0.5-事件处理器
监听事件 可以用 v-on 指令监听 DOM 事件来触发一些 JavaScript 代码. 示例: <div id="example-1"> <button v- ...