• 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
    ");
    			else printf("%d
    ", ans[i]);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    python爬虫scrapy之登录知乎
    python爬虫scrapy之downloader_middleware设置proxy代理
    python爬虫scrapy之如何同时执行多个scrapy爬行任务
    python爬虫之scrapy的pipeline的使用
    TotoiseSVN使用教程
    Office办公软件各版本下载(一键安装)
    如何彻底卸载系统自带的IE浏览器
    Sublime Text 3使用方法
    计算机常用键盘快捷键
    WordPress TinyMCE 编辑器增强技巧大全
  • 原文地址:https://www.cnblogs.com/s1124yy/p/6980563.html
Copyright © 2020-2023  润新知