2 条题解
-
1
tarjan
#include<bits/stdc++.h> using namespace std; int n,q,rt,ans[100001]; //n:点数 q:问题数 rt:根 ans[i]:第i个问题的结果 struct upp{ int tu,yu; }; vector<upp> e[100001];//问题记录 vector<upp> a[100001]; int de[100001];//距根节点距离 int fa[100001]; int fi(int x) { if(fa[x]==x) return x; return fa[x]=fi(fa[x]); } void sbga(int n,int u,int f)//n:这一个 u:上一个 f:距顶点距离 { de[n]=f;//记录n距根节点距离 for(int i=0;i<e[n].size();i++) { int too=e[n][i].tu;//n --> too int nowe=e[n][i].yu;//nowe:问题编号 if(de[too]!=-1) { int w=fi(too); if(ans[nowe]==-1) ans[nowe]=de[n]+de[too]-2*de[w]; } } for(int i=0;i<a[n].size();i++) { int nxt=a[n][i].tu;// nxt:下一个 int nxfar=a[n][i].yu;//nxfar:距下一个距离 if(nxt==u) continue; if(de[nxt]==-1) sbga(nxt,n,f+nxfar); fa[nxt]=n; } } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>q; for(int i=1;i<=n-1;i++) { int x,y,z; cin>>x>>y>>z; a[x].push_back((upp){y,z}); a[y].push_back((upp){x,z}); rt=y; } memset(de,-1,sizeof(de)); memset(ans,-1,sizeof(ans)); de[rt]=0; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=q;i++) { int x,y; cin>>x>>y; if(x==y) ans[i]=0; e[x].push_back((upp){y,i}); e[y].push_back((upp){x,i}); } sbga(rt,0,0); for(int i=1;i<=q;i++) cout<<ans[i]<<"\n"; return 0; }
信息
- ID
- 786
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 39
- 已通过
- 19
- 上传者