[HDOJ2874]Connections between cities(LCA, 离线tarjan)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874
这题有不连通的情况,特别注意。
觉得是存query的姿势不对,用前向星存了一遍,还是T……
/*
━━━━━┒ギリギリ♂ eye!
┓┏┓┏┓┃キリキリ♂ mind!
┛┗┛┗┛┃\○/
┓┏┓┏┓┃ /
┛┗┛┗┛┃ノ)
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┃┃┃┃┃┃
┻┻┻┻┻┻
*/
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std;
#define fr first
#define sc second
#define cl clear
#define BUG puts("here!!!")
#define W(a) while(a--)
#define pb(a) push_back(a)
#define Rint(a) scanf("%d", &a)
#define Rll(a) scanf("%lld", &a)
#define Rs(a) scanf("%s", a)
#define Cin(a) cin >> a
#define FRead() freopen("in", "r", stdin)
#define FWrite() freopen("out", "w", stdout)
#define Rep(i, len) for(int i = 0; i < (len); i++)
#define For(i, a, len) for(int i = (a); i < (len); i++)
#define Cls(a) memset((a), 0, sizeof(a))
#define Clr(a, x) memset((a), (x), sizeof(a))
#define Full(a) memset((a), 0x7f7f, sizeof(a))
#define lp p << 1
#define rp p << 1 | 1
#define pi 3.14159265359
#define RT return
#define lowbit(x) x & (-x)
#define onenum(x) __builtin_popcount(x)
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
typedef pair<int, int> pii;
typedef pair<string, int> psi;
typedef map<string, int> msi;
typedef vector<int> vi;
typedef vector<LL> vl;
typedef vector<vl> vvl;
typedef vector<bool> vb; typedef struct Query {
int idx;
int u, v;
Query() {}
Query(int uu, int vv, int ii) : u(uu), v(vv), idx(ii) {}
}Query; typedef struct Edge {
int u, v, w, idx;
int next;
Edge() {}
Edge(int uu, int vv, int ww) : u(uu), v(vv), w(ww) {}
}Edge; typedef struct Ans {
int idx;
int ans;
Ans() {}
Ans(int aa, int ii) :ans(aa), idx(ii) {}
}Ans; const int maxn = ;
const int maxm = ;
int n, m, c, qcnt;
int depth[maxn];
bool vis[maxn];
int pre[maxn];
Ans ans[maxm];
Edge edge[maxn];
Edge q[maxm];
Query qq[maxm];
int qhead[maxm];
int head[maxn];
int ecnt;
int u, v, w; void adde(int u, int v, int w) {
edge[ecnt].u = u;
edge[ecnt].v = v;
edge[ecnt].w = w;
edge[ecnt].next = head[u];
head[u] = ecnt++;
} void addq(int u, int v, int i) {
q[qcnt].u = u;
q[qcnt].v = v;
q[qcnt].idx = i;
q[qcnt].next = qhead[u];
qhead[u] = ecnt++;
} int find(int x) {
return x == pre[x] ? x : pre[x] = find(pre[x]);
} void unite(int x, int y) {
x = find(x);
y = find(y);
if(x != y) pre[y] = x;
} void dfs(int u, int p, int d) {
depth[u] = d;
for(int i = head[u]; ~i; i=edge[i].next) {
int v = edge[i].v;
if(!vis[v] && v != p) {
dfs(v, u, d+edge[i].w);
unite(u, v);
}
}
vis[u] = ;
for(int i = qhead[u]; ~i; i=q[i].next) {
int uu = q[i].u;
int vv = q[i].v;
int idx = q[i].idx;
if((vis[vv] && uu == u) || (vis[uu] && vv == u)) {
ans[idx].ans = depth[vv] + depth[uu];
}
}
} bool cmp(Ans x, Ans y) {
return x.idx < y.idx;
} int ufs[maxn]; int find1(int x) {
return ufs[x] == x ? x : ufs[x] = find1(ufs[x]);
} void unite1(int x, int y) {
x = find1(x);
y = find1(y);
if(x != y) ufs[y] = x;
} inline bool scan_d(int &num) {
char in;bool IsN=false;
in=getchar();
if(in==EOF) return false;
while(in!='-'&&(in<''||in>'')) in=getchar();
if(in=='-'){ IsN=true;num=;}
else num=in-'';
while(in=getchar(),in>=''&&in<=''){
num*=,num+=in-'';
}
if(IsN) num=-num;
return true;
} int main() {
// FRead();
while(~scanf("%d%d%d",&n,&m,&c)) {
Cls(vis); Cls(depth); Cls(ans); Clr(head, -); Clr(qhead, -);
qcnt = ; Rep(i, n+) pre[i] = i, ufs[i] = i;
Rep(i, m) {
scan_d(u); scan_d(v); scan_d(w);
adde(u, v, w); adde(v, u, w);
unite1(u, v);
}
Rep(i, c) {
scan_d(u); scan_d(v);
addq(u, v, i);
qq[i] = Query(u, v, i);
}
For(i, , n+) if(!vis[i]) dfs(i, -, );
Rep(i, c) {
if(find1(qq[ans[i].idx].u) != find1(qq[ans[i].idx].v)) puts("Not connected");
else printf("%d\n", ans[i].ans);
}
}
RT ;
}
……TARJAN也T了……
/*
━━━━━┒ギリギリ♂ eye!
┓┏┓┏┓┃キリキリ♂ mind!
┛┗┛┗┛┃\○/
┓┏┓┏┓┃ /
┛┗┛┗┛┃ノ)
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┃┃┃┃┃┃
┻┻┻┻┻┻
*/
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std;
#define fr first
#define sc second
#define cl clear
#define BUG puts("here!!!")
#define W(a) while(a--)
#define pb(a) push_back(a)
#define Rint(a) scanf("%d", &a)
#define Rll(a) scanf("%lld", &a)
#define Rs(a) scanf("%s", a)
#define Cin(a) cin >> a
#define FRead() freopen("in", "r", stdin)
#define FWrite() freopen("out", "w", stdout)
#define Rep(i, len) for(int i = 0; i < (len); i++)
#define For(i, a, len) for(int i = (a); i < (len); i++)
#define Cls(a) memset((a), 0, sizeof(a))
#define Clr(a, x) memset((a), (x), sizeof(a))
#define Full(a) memset((a), 0x7f7f, sizeof(a))
#define lp p << 1
#define rp p << 1 | 1
#define pi 3.14159265359
#define RT return
#define lowbit(x) x & (-x)
#define onenum(x) __builtin_popcount(x)
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
typedef pair<int, int> pii;
typedef pair<string, int> psi;
typedef map<string, int> msi;
typedef vector<int> vi;
typedef vector<LL> vl;
typedef vector<vl> vvl;
typedef vector<bool> vb; typedef struct Query {
int idx;
int u, v;
Query() {}
Query(int uu, int vv, int ii) : u(uu), v(vv), idx(ii) {}
}Query; typedef struct Edge {
int u, v, w;
int next;
Edge() {}
Edge(int uu, int vv, int ww) : u(uu), v(vv), w(ww) {}
}Edge; typedef struct Ans {
int idx;
int ans;
Ans() {}
Ans(int aa, int ii) :ans(aa), idx(ii) {}
}Ans; const int maxn = ;
const int maxm = ;
int n, m, c, qcnt;
int depth[maxn];
bool vis[maxn];
int pre[maxn];
Query q[maxm];
Ans ans[maxm];
Edge edge[maxn];
int head[maxn];
int ecnt;
int u, v, w; void adde(int u, int v, int w) {
edge[ecnt].u = u;
edge[ecnt].v = v;
edge[ecnt].w = w;
edge[ecnt].next = head[u];
head[u] = ecnt++;
} int find(int x) {
return x == pre[x] ? x : pre[x] = find(pre[x]);
} void unite(int x, int y) {
x = find(x);
y = find(y);
if(x != y) pre[y] = x;
} void dfs(int u, int p, int d) {
depth[u] = d;
for(int i = head[u]; ~i; i=edge[i].next) {
int v = edge[i].v;
if(!vis[v] && v != p) {
dfs(v, u, d+edge[i].w);
unite(u, v);
}
}
vis[u] = ;
Rep(i, qcnt) {
int uu = q[i].u;
int vv = q[i].v;
int idx = q[i].idx;
if((vis[vv] && uu == u) || (vis[uu] && vv == u)) {
ans[idx].idx = idx;
ans[idx].ans = depth[vv] + depth[uu];
}
}
} bool cmp(Ans x, Ans y) {
return x.idx < y.idx;
} int ufs[maxn]; int find1(int x) {
return ufs[x] == x ? x : ufs[x] = find1(ufs[x]);
} void unite1(int x, int y) {
x = find1(x);
y = find1(y);
if(x != y) ufs[y] = x;
} inline bool scan_d(int &num) {
char in;bool IsN=false;
in=getchar();
if(in==EOF) return false;
while(in!='-'&&(in<''||in>'')) in=getchar();
if(in=='-'){ IsN=true;num=;}
else num=in-'';
while(in=getchar(),in>=''&&in<=''){
num*=,num+=in-'';
}
if(IsN) num=-num;
return true;
} int main() {
// FRead();
while(~scanf("%d%d%d",&n,&m,&c)) {
Cls(vis); Cls(depth); Cls(ans); Clr(head, -);
qcnt = ; Rep(i, n+) pre[i] = i, ufs[i] = i;
Rep(i, m) {
scan_d(u); scan_d(v); scan_d(w);
adde(u, v, w); adde(v, u, w);
unite1(u, v);
}
Rep(i, c) {
scan_d(u); scan_d(v);
q[qcnt++] = Query(u, v, i);
}
For(i, , n+) if(!vis[i]) dfs(i, -, );
Rep(i, c) {
if(find1(q[ans[i].idx].u) != find1(q[ans[i].idx].v)) puts("Not connected");
else printf("%d\n", ans[i].ans);
}
}
RT ;
}
在线胡搞T了,等下写个离线的。
TLE代码:
/*
━━━━━┒ギリギリ♂ eye!
┓┏┓┏┓┃キリキリ♂ mind!
┛┗┛┗┛┃\○/
┓┏┓┏┓┃ /
┛┗┛┗┛┃ノ)
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┃┃┃┃┃┃
┻┻┻┻┻┻
*/
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std;
#define fr first
#define sc second
#define cl clear
#define BUG puts("here!!!")
#define W(a) while(a--)
#define pb(a) push_back(a)
#define Rint(a) scanf("%d", &a)
#define Rll(a) scanf("%I64d", &a)
#define Rs(a) scanf("%s", a)
#define Cin(a) cin >> a
#define FRead() freopen("in", "r", stdin)
#define FWrite() freopen("out", "w", stdout)
#define Rep(i, len) for(int i = 0; i < (len); i++)
#define For(i, a, len) for(int i = (a); i < (len); i++)
#define Cls(a) memset((a), 0, sizeof(a))
#define Clr(a, x) memset((a), (x), sizeof(a))
#define Full(a) memset((a), 0x7f7f, sizeof(a))
#define pi 3.14159265359
#define RT return
#define lowbit(x) x & (-x)
#define onenum(x) __builtin_popcount(x)
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
typedef pair<int, int> pii;
typedef pair<string, int> psi;
typedef map<string, int> msi;
typedef vector<int> vi;
typedef vector<LL> vl;
typedef vector<vl> vvl;
typedef vector<bool> vb; typedef struct Edge {
int u, v, w;
int next;
}Edge;
const int maxn = ;
const int maxm = ;
int n, m, c;
int depth[maxn], fa[maxn];
int pre[maxn];
Edge edge[maxm];
int head[maxn];
int ecnt;
bool vis[maxn]; void adde(int u, int v, int w) {
edge[ecnt].u = u;
edge[ecnt].v = v;
edge[ecnt].w = w;
edge[ecnt].next = head[u];
head[u] = ecnt++;
} int find(int x) {
x == pre[x] ? x : pre[x] = find(pre[x]);
} void unite(int x, int y) {
x = find(x);
y = find(y);
if(x != y) pre[y] = x;
} void dfs(int u, int p, int d) {
vis[u] = ;
depth[u] = d; fa[u] = p;
for(int i = head[u]; ~i; i=edge[i].next) {
int v = edge[i].v;
int w = edge[i].w;
if(!vis[v]) dfs(v, u, d+w);
}
} int lca(int u, int v) {
int s = ;
while(depth[u] > depth[v]) {
s += depth[u];
u = pre[u];
}
while(depth[v] > depth[u]) {
s += depth[v];
v = pre[v];
}
while(u != v) {
s += (depth[u] + depth[v]);
u = pre[u];
v = pre[v];
}
return s;
} inline bool scan_d(int &num) {
char in;bool IsN=false;
in=getchar();
if(in==EOF) return false;
while(in!='-'&&(in<''||in>'')) in=getchar();
if(in=='-'){ IsN=true;num=;}
else num=in-'';
while(in=getchar(),in>=''&&in<=''){
num*=,num+=in-'';
}
if(IsN) num=-num;
return true;
} int main() {
FRead();
int u, v, w;
while(~scanf("%d%d%d",&n,&m,&c)) {
Clr(head, -); ecnt = ;
Rep(i, n+) pre[i] = i;
Rep(i, m) {
scan_d(u); scan_d(v); scan_d(w);
adde(u, v, w); adde(v, u, w);
unite(u, v);
}
For(i, , n+) {
if(!vis[i]) {
dfs(i, -, );
}
}
W(c) {
scan_d(u); scan_d(v);
if(find(u) != find(v)) puts("Not connected");
else printf("%d\n", lca(u, v));
}
}
RT ;
}
[HDOJ2874]Connections between cities(LCA, 离线tarjan)的更多相关文章
- hdu-2874 Connections between cities(lca+tarjan+并查集)
题目链接: Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/327 ...
- HDU 2874 Connections between cities(LCA Tarjan)
Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...
- hdu 2874 Connections between cities [LCA] (lca->rmq)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- [POJ1330]Nearest Common Ancestors(LCA, 离线tarjan)
题目链接:http://poj.org/problem?id=1330 题意就是求一组最近公共祖先,昨晚学了离线tarjan,今天来实现一下. 个人感觉tarjan算法是利用了dfs序和节点深度的关系 ...
- 近期公共祖先(LCA)——离线Tarjan算法+并查集优化
一. 离线Tarjan算法 LCA问题(lowest common ancestors):在一个有根树T中.两个节点和 e&sig=3136f1d5fcf75709d9ac882bd8cfe0 ...
- LCA离线Tarjan,树上倍增入门题
离线Tarjian,来个JVxie大佬博客最近公共祖先LCA(Tarjan算法)的思考和算法实现,还有zhouzhendong大佬的LCA算法解析-Tarjan&倍增&RMQ(其实你们 ...
- Connections between cities LCA
Problem Description After World War X, a lot of cities have been seriously damaged, and we need to r ...
- HDU 2874 Connections between cities (LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意是给你n个点,m条边(无向),q个询问.接下来m行,每行两个点一个边权,而且这个图不能有环路 ...
- [hdu2874]Connections between cities(LCA+并查集)
题意:n棵树,求任意两点的最短距离. 解题关键:并查集判断两点是否位于一棵树上,然后求最短距离即可.此题可以直接对全部区间直接进行st表,因为first数组会将连接的两点的区间表示出来. //#pra ...
随机推荐
- 帝国cms后台不停的登录成功
http://bbs.phome.net/showthread-13-305985-1.html 感谢各位的支持与帮助! e/data/adminlogin目录权限没有问题 问题在:计划任务中,刷新自 ...
- [转]宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
[转]宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等 http://blog.csdn.net/yiya1989/article/details/784 ...
- 2016 系统设计第一期 (档案一)jQuery radio 取值赋值
MVC代码: <div class="form-group"> <label for="Gender" class="col-sm- ...
- Win8 硬盘100%几个修复方法
上连接 1.改注册表:http://jingyan.baidu.com/article/e3c78d647f79be3c4c85f5d0.html 2.待续
- Careercup - Facebook面试题 - 5733320654585856
2014-05-02 09:59 题目链接 原题: Group Anagrams input = ["star, astr, car, rac, st"] output = [[& ...
- 【转】HTTP-only Cookie 脚本获取JSESSIONID的方法
彻底避免xss攻击的方法. 别人可以通过注入js脚本获取你的session cookie,如果幸运的话还可以获取通过js遍历你的dom树获取你的用户的用户名和密码. 如果只是通过正则表达式验证输入的话 ...
- Java 集合类(一)
今天我们先讲一下Collection: Collection和Collections的区别: java.util.Collection是一种java集合接口,它提供了对集合对象的基本操作通用接口方法, ...
- 在eclipse里的 flex 没有可视化的编辑
注:在4.7版本里去掉了可视化编辑器. 转自:http://3470973.blog.51cto.com/3460973/1135328 最近eclipse切换了一个工作空间,创建的flex项 ...
- Basic Concepts of International Trade
The international trade structure is a reflection of worldwide economic development, industrial stru ...
- mysql 错误- 磁盘空间不足,
mysql 磁盘空间不足错误 磁盘空间满了, 写不进去了. :: mysqld_safe Starting mysqld daemon with databases from /alidata/ser ...