题目链接: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)的更多相关文章

  1. hdu-2874 Connections between cities(lca+tarjan+并查集)

    题目链接: Connections between cities Time Limit: 10000/5000 MS (Java/Others)     Memory Limit: 32768/327 ...

  2. HDU 2874 Connections between cities(LCA Tarjan)

    Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...

  3. hdu 2874 Connections between cities [LCA] (lca->rmq)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  4. [POJ1330]Nearest Common Ancestors(LCA, 离线tarjan)

    题目链接:http://poj.org/problem?id=1330 题意就是求一组最近公共祖先,昨晚学了离线tarjan,今天来实现一下. 个人感觉tarjan算法是利用了dfs序和节点深度的关系 ...

  5. 近期公共祖先(LCA)——离线Tarjan算法+并查集优化

    一. 离线Tarjan算法 LCA问题(lowest common ancestors):在一个有根树T中.两个节点和 e&sig=3136f1d5fcf75709d9ac882bd8cfe0 ...

  6. LCA离线Tarjan,树上倍增入门题

    离线Tarjian,来个JVxie大佬博客最近公共祖先LCA(Tarjan算法)的思考和算法实现,还有zhouzhendong大佬的LCA算法解析-Tarjan&倍增&RMQ(其实你们 ...

  7. Connections between cities LCA

    Problem Description After World War X, a lot of cities have been seriously damaged, and we need to r ...

  8. HDU 2874 Connections between cities (LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意是给你n个点,m条边(无向),q个询问.接下来m行,每行两个点一个边权,而且这个图不能有环路 ...

  9. [hdu2874]Connections between cities(LCA+并查集)

    题意:n棵树,求任意两点的最短距离. 解题关键:并查集判断两点是否位于一棵树上,然后求最短距离即可.此题可以直接对全部区间直接进行st表,因为first数组会将连接的两点的区间表示出来. //#pra ...

随机推荐

  1. mysql查询差集

    select A.* from A left join B using(name,addr,age) where B.name is NULL; select A.* from A left join ...

  2. android studio 中设置apk的版本号

    今天在mainfest.xml中设置版本号为2,(代码获取到的版本号无效) android:versionCode="2" android:versionName="2. ...

  3. arm-none-eabi-gcc,makefile,stm官方库构建stm32f4xx工程

    参考文章:http://www.stmcu.org/module/forum/forum.php?mod=viewthread&tid=603753&highlight=ubuntu ...

  4. CSDN——【低调的草原狼】——Ext4.2学习目录整理

    最近在研究ExtJS,发现CSDN中有个博客中一系列文档非常优秀,但是没有对目录进行整理,在此稍作整理,也为以后自己研究打下一个基础: 原文作者:低调的草原狼 目录:     1.ExtJS4.2学习 ...

  5. C/C++ 快速排序 quickSort

    下面的动画展示了快速排序算法的工作原理. 快速排序图示:可以图中在每次的比较选取的key元素为序列最后的元素. #include <stdio.h> #include <stdlib ...

  6. lunux 启动 tomcat

    本人从官网http://tomcat.apache.org/上面下载的6.0.1_31版本,并解压包后改名存放在:/usr/share/tomcat6 本人使用的是root用户登录,下面就说说具体的操 ...

  7. Follow Path -》 Unity3d通用脚本

    PathDefinition.cs using UnityEngine; using System.Collections; using System.Collections.Generic; usi ...

  8. linux网卡速率和双工模式的配置

    linux网卡速率和双工模式的配置 (2012-09-06 14:39:57) 转载▼ 标签: 科技 网络接口 协商 网卡 工具 it 分类: Linux 改变网络接口的速度和协商方式的工具miito ...

  9. 【leetcode】Combination Sum (middle)

    Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...

  10. crontab定时运行git命令 更新代码库

    Q:  http://stackoverflow.com/questions/7994663/git-push-via-cron    I'm trying to run a git push fro ...