HDU 2586 How far away ? (LCA最近公共祖先)

题目地址:HDU 2586 LCA第一发。 纯模板题。 偷懒用的vector,,结果一直爆栈。把G++改成C++就过了。。 代码如下:

;mod=1e9+7;const int INF=0x3f3f3f3f;const double eqs=1e-9;const int MAXN=40000+10;int bin[MAXN], dis[MAXN], head[MAXN], cnt, n, vis[MAXN], ans[MAXN];vector<int>vec[MAXN], num[MAXN];struct node{int u, v, w, next;}edge[MAXN<<1];void add(int u, int v, int w){edge[cnt].v=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;}int find1(int x){return bin[x]==x?x:bin[x]=find1(bin[x]);}void tarjan(int u){vis[u]=1;for(int i=0;i<vec[u].size();i++){int v=vec[u][i];if(!vis[v]) continue ;ans[num[u][i]]=dis[u]+dis[v]-2*dis[find1(v)];}for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].v;if(vis[v]) continue ;dis[v]=dis[u]+edge[i].w;tarjan(v);bin[v]=u;}}void init(){memset(head,-1,sizeof(head));memset(vis,0,sizeof(vis));cnt=0;for(int i=1;i<=n;i++){bin[i]=i;}}int main(){int t, m, i, j, u, v, w;scanf(“%d”,&t);while(t–){scanf(“%d%d”,&n,&m);init();for(i=0;i<n-1;i++){scanf(“%d%d%d”,&u,&v,&w);add(u,v,w);add(v,u,w);}for(i=0;i<m;i++){scanf(“%d%d”,&u,&v);vec[u].push_back(v);num[u].push_back(i);vec[v].push_back(u);num[v].push_back(i);}dis[1]=0;tarjan(1);for(i=0;i<m;i++){printf(“%d\n”,ans[i]);}}return 0;}

在乎的是沿途的风景以及看风景的心情,让心灵去旅行!

HDU 2586 How far away ? (LCA最近公共祖先)

相关文章:

你感兴趣的文章:

标签云: