• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ACM s1124yy
守りたいものが 強くさせること
博客园    首页    新随笔    联系   管理     

HDU 2874 Connections between cities(LCA Tarjan)

Connections between cities

【题目链接】Connections between cities

【题目类型】LCA Tarjan

&题意:

输入一个森林,总节点不超过N(N<10000),由C次询问(C<1000000),每次询问两个点,如果来联通输出,两点之间的距离,如果不来联通,输出“Not connected”

&题解:

md,就没人吐槽这题询问时有相等的情况吗?我被这个坑了一天= = 最后把ans数组置为-1才过的,以前一直初始化为0,就总是wa,因为有ans0的情况,就是在ij时.

【时间复杂度】\(O(n+q)\)

&代码:

#include <cstdio>
#include <bitset>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define fo(i,a,b) for(int i=(a);i<=(b);i++)
#define fd(i,a,b) for(int i=(a);i>=(b);i--)
#define cle(a,v) memset(a,(v),sizeof(a))
const int maxn = 2e4 + 7, maxq = 2e6 + 7;
int n, m, q, Head[maxn], QHead[maxn], Dis[maxn], id, iq, fa[maxn], ans[maxq / 2], vis[maxn];
int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
struct Edge {
	int to, next, w;
} ed[maxn], Qed[maxq];
void ori() {
	cle(Head, -1); cle(QHead, -1);
	id = iq = 0;
	cle(vis, 0);
	cle(Dis, 0);
	cle(ans, -1);
}
void Add(int u, int v, int w) {
	ed[id].to = v; ed[id].w = w; ed[id].next = Head[u];
	Head[u] = id++;
}
void QAdd(int u, int v, int index) {
	Qed[iq].to = v, Qed[iq].next = QHead[u], Qed[iq].w = index;
	QHead[u] = iq++;
}
void LCA(int r, int d, int top) {
	fa[r] = r;
	vis[r] = top;
	Dis[r] = d;
	for(int k = Head[r]; ~k; k = ed[k].next) {
		if(!vis[ed[k].to]) {
			LCA(ed[k].to, d + ed[k].w, top);
			fa[ed[k].to] = r;
		}
	}
	for(int k = QHead[r]; ~k; k = Qed[k].next) {
		if(vis[Qed[k].to] == top) {
			ans[Qed[k].w] = Dis[r] + Dis[Qed[k].to] - 2 * Dis[find(Qed[k].to)];
		}
	}
}
int main() {
	freopen("E:1.in", "r", stdin);
	while(~scanf("%d%d%d", &n, &m, &q)) {
		ori();
		int u, v, w;
		fo(i, 1, m) {
			scanf("%d%d%d", &u, &v, &w);
			Add(u, v, w); Add(v, u, w);
		}
		fo(i, 1, q) {
			scanf("%d%d", &u, &v);
			QAdd(u, v, i); QAdd(v, u, i);
		}
		fo(i, 1, n) {
			if(!vis[i]) {
				LCA(i, 0, i);
			}
		}
		fo(i, 1, q) {
			if(ans[i] == -1) printf("Not connected\n");
			else printf("%d\n", ans[i]);
		}
	}
	return 0;
}
posted @ 2017-06-11 01:41  s1124yy  阅读(91)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3