标签:script using queue pst res ios rest vector string
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 12950 | Accepted: 4577 | |
Case Time Limit: 1000MS |
Description
Input
Output
Sample Input
7 6 1 6 13 E 6 3 9 E 3 5 7 S 4 1 3 N 2 4 20 W 4 7 2 S 3 1 6 1 4 2 6
Sample Output
13 3 36
Hint
Source
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <queue> #include <vector> #define inf 10000000000000 #define met(a,b) memset(a,b,sizeof a) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long ll; using namespace std; const int N = 3e6+5; const int M = 4e5+5; int n,m,k,tot=0; int fa[N][20],head[N],dis[N],dep[N]; struct man{ int to,next,w; }edg[N]; void add(int u,int v,int w){ edg[tot].to=v;edg[tot].next=head[u];edg[tot].w=w;head[u]=tot++; } void dfs(int u,int f){ fa[u][0]=f; for(int i=1;i<20;i++){ fa[u][i]=fa[fa[u][i-1]][i-1]; } for(int i=head[u];i!=-1;i=edg[i].next){ int v=edg[i].to; if(v!=f){ dis[v]=dis[u]+edg[i].w; dep[v]=dep[u]+1; dfs(v,u); } } } int lca(int u,int v){ int U=u,V=v; if(dep[u]<dep[v])swap(u,v); for(int i=19;i>=0;i--){ if(dep[fa[u][i]]>=dep[v]){ u=fa[u][i]; } } if(u==v)return (abs(dis[U]-dis[V])); for(int i=19;i>=0;i--){ if(fa[u][i]!=fa[v][i]){ u=fa[u][i];v=fa[v][i]; } } return (dis[U]+dis[V]-2*dis[fa[u][0]]); } int main(){ met(head,-1); scanf("%d%d",&n,&m); char str[10]; int u,v,w; while(m--){ scanf("%d%d%d",&u,&v,&w); scanf("%s",str); add(u,v,w);add(v,u,w); } dep[1]=1; dfs(1,0); scanf("%d",&k); while(k--){ scanf("%d%d",&u,&v); printf("%d\n",lca(u,v)); } return 0; }
POJ1986 Distance Queries (LCA)(倍增)
标签:script using queue pst res ios rest vector string
原文地址:http://www.cnblogs.com/jianrenfang/p/6156086.html