AtCoder Beginner Contest 070 D
来源:互联网 发布:知乎女神王 出书 编辑:程序博客网 时间:2024/05/17 05:19
D - Transit Tree Path
Description
Input
Output
Sample Input
51 2 11 3 12 4 13 5 13 12 42 34 5
Sample Output
324
Hint
题意
51 2 11 3 12 4 13 5 13 12 42 34 5
题解:
324
AC代码
DFS 代码
#include <bits/stdc++.h>using namespace std;#define LL long long#define CLR(a,b) memset(a,(b),sizeof(a))const int INF = 0x3f3f3f3f;const LL INFLL = 0x3f3f3f3f3f3f3f3f;const int N = 1e5+10;vector<pair<int,int> > G[N];LL par[N];int dfs(int x,int y){ for(int i = 0; i < G[x].size(); i++) { int j = G[x][i].first; if(j == y) continue; par[j] = par[x] + G[x][i].second; dfs(j, x); }}int main(){ int n; int x, y, z; scanf("%d",&n); for(int i = 0; i < n-1; i++) { scanf("%d%d%d",&x,&y,&z); G[x].push_back(make_pair(y,z)); G[y].push_back(make_pair(x,z)); } int q, k; scanf("%d%d",&q,&k); par[k] = 0; dfs(k, -1); while(q--) { scanf("%d%d",&x,&y); printf("%lld\n",par[x]+par[y]); }return 0;}
LCA代码
#include<bits/stdc++.h>using namespace std ;typedef long long LL ;const int MAXN = 1e5+100 ;const int MAXM = 1e5 ;const int mod = 1e9+7 ;struct Edge { LL from,to,val,next;}edge[MAXN<<2];LL head[MAXN],top;LL n,m;void init(){ memset(head,-1,sizeof(head)); top=0;}void addedge(LL a,LL b,LL c){ Edge e={a,b,c,head[a]}; edge[top]=e;head[a]=top++;}void getmap(){ LL a,b,c; while(m--){ scanf("%lld%lld%lld",&a,&b,&c); addedge(a,b,c); addedge(b,a,c); }}LL fa[MAXN][50+5],depth[MAXN];LL dist[MAXN];void dfs(LL now,LL par){ fa[now][0]=par; for(LL i=1;i<50;i++){ fa[now][i]=fa[fa[now][i-1]][i-1]; } for(LL i=head[now];i!=-1;i=edge[i].next){ Edge e=edge[i]; if(e.to!=par){ dist[e.to]=dist[now]+e.val; depth[e.to]=depth[now]+1; dfs(e.to,now); } }}LL lca(LL a,LL b){ if(depth[a]<depth[b]) swap(a,b); for(LL i=49;i>=0;i--){ if(depth[fa[a][i]]>=depth[b]){ a=fa[a][i]; } } if(a==b) return b; for(LL i=49;i>=0;i--){ if(fa[a][i]!=fa[b][i]){ a=fa[a][i]; b=fa[b][i]; } } return fa[b][0];}void solve(){ depth[1]=0;dist[1]=0; dfs(1,-1); LL q,k; scanf("%lld%lld",&q,&k); while(q--){ LL a,b; scanf("%lld%lld",&a,&b); LL dis1=dist[a]+dist[k]-2*dist[lca(a,k)]; LL dis2=dist[b]+dist[k]-2*dist[lca(b,k)]; printf("%lld\n",dis1+dis2); }}int main(){ scanf("%lld",&n);m=n-1; init(); getmap(); solve();}
阅读全文
0 0
- AtCoder Beginner Contest 070-D
- AtCoder Beginner Contest 070 D
- AtCoder Beginner Contest 070
- AtCoder Beginner Contest 061 D
- AtCoder Beginner Contest 066 D
- AtCoder Beginner Contest 067 D
- AtCoder Beginner Contest 067 D
- AtCoder Beginner Contest 068 D
- AtCoder Beginner Contest 069 D
- AtCoder Beginner Contest 071 D
- AtCoder Beginner Contest 075 D
- AtCoder Beginner Contest 076 D
- AtCoder Beginner Contest 081 D
- AtCoder Beginner Contest 081 D
- AtCoder AtCoder Beginner Contest 063 D
- AtCoder Beginner Contest 058 D井井井 / ###【“贡献”】
- [AtCoder Beginner Contest 077]D-Small Multiple
- AtCoder Beginner Contest 070 Transit Tree Path
- API Gateway
- android db 导入 手机 系统 目录 data/data/包名/databases
- 调unity webgl sendmessage
- web.xml中webAppRootKey
- 数据、数据元素、数据对象、数据结构的定义
- AtCoder Beginner Contest 070 D
- 百度之星初赛(B)--Factory---虚树/比格思茅/LCA
- 浅谈Java SE、Java EE、Java ME三者的区别
- 解决Win10成功安装pycrypto后依旧报错找不到
- 网页变幻云+canvas时钟
- 从能级的角度来看半导体的掺杂
- 由二叉树的前序序列和中序序列构建二叉树
- MAC上为Android Studio集成Genymotion模拟器
- web无插件播放RTSP摄像机方案,拒绝插件,拥抱H5!