hdu 2586【lca的tarjan算法】
2012-03-27 17:23
113 查看
哈哈,让我把错误给找出来了,c++ 31ms,(*^__^*) 嘻嘻……有点成就感,也有点烦闷,单步调试终于把错误搞出来了,可是这个是递归诶,单步调试,我的时间啊。。。。~~~~(>_<)~~~~
错误是:合并时应该将孩子像父亲这方合并。。。。。。否则会是错误答案,把错误找出来后就知道为什么了。。。画画图就知道了。。。
View Code
错误是:合并时应该将孩子像父亲这方合并。。。。。。否则会是错误答案,把错误找出来后就知道为什么了。。。画画图就知道了。。。
View Code
#include <cstdio> #include <cstring> const int maxn = 40010; struct node { int tag; int w; struct node *next; }*temp; struct head { struct node *next; }; head pnt[maxn]; head que[maxn]; bool vis[maxn]; int ans[maxn]; int f[maxn]; int dis[maxn]; int n,m; int ind[maxn]; void init() { for(int i = 0;i <= n;i ++) { f[i] = i; pnt[i].next = NULL; que[i].next = NULL; } memset(vis,false,sizeof(vis)); memset(ans,0,sizeof(ans)); memset(ind,0,sizeof(ind)); memset(dis,0,sizeof(dis)); } void insert_edge(int a,int b,int w) { temp = new node; temp -> tag = b; temp -> w = w; temp -> next = pnt[a].next; pnt[a].next = temp; } void insert_ans(int a,int b,int l) { node *temp = new node; temp -> tag = b; temp -> w = l; temp ->next = que[a].next; que[a].next = temp; } int find(int x) { if(x == f[x]) return x; f[x] = find(f[x]); return f[x]; } void join(int x,int y) { int fx = find(x); int fy = find(y); if(fx == fy) return ; f[fy] = fx; } void lca(int x,int d) { dis[x] = d; vis[x] = true; for(node *t = que[x].next;t != NULL;t = t ->next) { if(vis[t -> tag]) { ans[t -> w] = dis[x] + dis[t -> tag] - 2 * dis[find(t->tag)]; } } for(node *t = pnt[x].next;t !=NULL;t = t -> next) { if(!vis[t -> tag]) { lca(t -> tag,d + t -> w); join(x,t -> tag); } } } int main() { int cas; scanf("%d",&cas); while(cas --) { scanf("%d%d",&n,&m); init(); int a,b,w; for(int i = 1;i < n;i ++) { scanf("%d%d%d",&a,&b,&w); insert_edge(a,b,w); ind[b] ++; //insert_edge(b,a,w); } for(int i = 1;i <= m;i ++) { scanf("%d%d",&a,&b); insert_ans(a,b,i); insert_ans(b,a,i); } for(int i = 1;i <= n;i ++) { if(ind[i] == 0) { lca(i,0); break; } //lca(1,0); } for(int i = 1;i <= m;i ++) { printf("%d\n",ans[i]); } } return 0; }
相关文章推荐
- 7_6_A题 How far away?题解[hdu 2586](LCA Tarjan算法)
- 【Lca 离线Tarjan算法】hdu 2586 How far away ?
- 【HDU 2586 How far away?】LCA问题 Tarjan算法
- HDU 2586 How far away ? (离线LCA Tarjan算法模板)
- HDU 2586 How far away ? tarjan算法求LCA
- [hdu 2586](LCA Tarjan算法)
- HDU 2586 How far away ? (LCA模板题 Tarjan算法求最小公共祖先)
- hdu 2586 How far away ? 最近公共祖先lca 在线算法(倍增法)/离线算法(Tarjan算法)
- HDU - 2586 How far away ?(离线Tarjan算法)
- hdu 2586 How far away ?(在线LCA+离线Tarjan)
- How far away ? HDU - 2586 tarjan求LCA
- HDU 2586 How far away ?(lca)
- HDU 2586 How far away?(lca模板)
- hdu 2586 How far away? (LCA模板)
- HDU 2586 LCA
- LCA的三种求法 - HDU 2586
- hdu 2586 How far away? 【LCA】 解题报告
- hdu 2874 Connections between cities hdu 2586 How far away ? LCA
- hdu 2586 How far away ?(LCA 求两点距离)
- hdu 2586 How far away ? lca求最短路