您的位置:首页 > 其它

hdu 2586【lca的tarjan算法】

2012-03-27 17:23 113 查看
哈哈,让我把错误给找出来了,c++ 31ms,(*^__^*) 嘻嘻……有点成就感,也有点烦闷,单步调试终于把错误搞出来了,可是这个是递归诶,单步调试,我的时间啊。。。。~~~~(>_<)~~~~

错误是:合并时应该将孩子像父亲这方合并。。。。。。否则会是错误答案,把错误找出来后就知道为什么了。。。画画图就知道了。。。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: