hdu2874 Connections between cities - LCA在线算法
来源:互联网 发布:淘宝店铺广告联盟 编辑:程序博客网 时间:2024/04/30 09:13
求任意两点之间的最短距离,本应该用最短路径算法。
但这题明确了图不含环,某些点之间可能没有边。
所以给出的图就可以转化为一片森林,对于每棵树,指定一个根节点root,dis[i]表示点i到root的距离,
任意两点i和j的最短距离 = dis[i] + dis[j] - 2 * dis[LCA(i, j)],
所以可以改用“并查集 + LCA”的方法
但这题明确了图不含环,某些点之间可能没有边。
所以给出的图就可以转化为一片森林,对于每棵树,指定一个根节点root,dis[i]表示点i到root的距离,
任意两点i和j的最短距离 = dis[i] + dis[j] - 2 * dis[LCA(i, j)],
所以可以改用“并查集 + LCA”的方法
并查集用于判断给定的两个点是否连通。
查阅过网上很多人给出的算法都是LCA离线算法,如今就只给出LCA的在线算法。
#include<stdio.h>#include<string.h>#include<vector>#include<queue>#define maxn 10001using namespace std;typedef struct NODE{int v, len;NODE(int _v=0, int _len=0):v(_v), len(_len){}bool operator < (const struct NODE& rhs) const{ return len < rhs.len; }} node;vector<node> edge[maxn];int dis[maxn];int H[maxn], fa[maxn];//点的高度,父结点void dfs(int u, int h, int father){H[u] = h;fa[u] = father;for(int i=0; i<edge[u].size(); i++){node& e = edge[u][i];if(!fa[e.v]){dis[e.v] = dis[u] + e.len;dfs(e.v, h+1, u);}}}void swap(int& a, int& b){int t = a; a = b; b = t;}int LCA(int p, int q){if(H[p] < H[q])swap(p, q);//确保p比q深,即p的高度大于q的高度while(H[p] > H[q]) p = fa[p];//将p提升至与q同一高度if(p == q) return p;while(p != q) p = fa[p], q = fa[q];//p和q一起提升直到两者"相遇"return p;}int solve(int p, int q){int tmp = LCA(p, q);return dis[p] + dis[q] - 2 * dis[tmp];}int f[maxn];//并查集int find(int x){return f[x]==x ? x : f[x]=find(f[x]);}int main(){freopen("input.txt", "r", stdin);int n;//n个点int m;//m条边int c;//c次询问int a, b, k;//点a和点b间的距离是kwhile(scanf("%d %d %d", &n, &m, &c) != EOF){int i;for(i=1; i<=n; i++) edge[i].clear(), f[i] = i;while(m--){scanf("%d %d %d", &a, &b, &k);edge[a].push_back( node(b, k) );edge[b].push_back( node(a, k) );int x = find(a), y = find(b);if(x<y) f[y] = x; else f[x] = y;}memset(H, 0, sizeof(H));memset(fa, 0, sizeof(fa)); for(int j=1; j<=n; j++)if(f[j]==j){dis[j] = 0;dfs(j, 1, -1);//点j是根,高度为1,求出连通分量其它点的高度,父结点}int p, q;while(c--){scanf("%d %d", &p, &q);if(find(p) != find(q))//p和q不在同一个连通分量printf("Not connected\n");else{int ans = solve(p, q); printf("%d\n", ans);}}}return 0;}
0 0
- hdu2874 Connections between cities - LCA在线算法
- 【HDU2874】Connections between cities-LCA算法
- hdu2874 Connections between cities--LCA
- HDU2874 Connections between cities【LCA】
- hdu2874 Connections between cities(LCA)
- hdu2874-Connections between cities (LCA/离线tarjan)
- hdu2874 Connections between cities (LCA离线)
- HDU2874 Connections between cities(tarjan-lca)
- hdu2874—Connections between cities(LCA)
- hdu2874 Connections between cities
- HDU2874 Connections between cities
- hdu2874 Connections between cities
- HDU2874 Connections between cities LCA+DFS或并查集
- hdu2874 Connections between cities(LCA离线+并查集)
- HDU2874——Connections between cities 详解 (LCA,RMQ,数据结构,dfs序,并查集)
- hdu 2874 Connections between cities(LCA离线算法)
- HDU 2874 - Connections between cities(LCA‘离线算法Tarjan)
- HDU 2874 Connections between cities(LCA离线算法)
- web前端中calc属性案例详解
- 学好Mac常用命令,助力iOS开发,mac常用命令ios
- PHP 代码优化技巧大盘点
- Redis相关概念
- hdu 2853
- hdu2874 Connections between cities - LCA在线算法
- 数据导入
- IOS开发中返回值为null时的处理
- iOS 面试题~愿所有移动开发者熬过寒冬
- java的数据类型思考
- XML之DTD
- OC下载网络数据简介
- 手机传感器大科普:手机中的陀螺仪、加速器和磁力计
- 在windows上编译32位和64位mono