首页 > 代码库 > HDU 5044 离线LCA算法

HDU 5044 离线LCA算法

昨天写了HDU 3966 ,本来这道题是很好解得,结果我想用离线LCA 耍一把,结果发现离线LCA 没理解透,错了好多遍,终得AC ,这题比起 HDU 3966要简单,因为他不用动态查询。但是我还是错了好多遍  T^T。。。

http://acm.split.hdu.edu.cn/showproblem.php?pid=5044

不多说了  思想不是很清楚的可以看一看我的上一篇博文 HDU 3966

直接贴代码

  1 #include<iostream>  2 #include<stdio.h>  3 #include<string.h>  4 #include <string>  5 #include <cmath>  6 #include <algorithm>  7 #include <map>  8 #include <set>  9 #include <queue> 10 #include <stack> 11 #include<stdlib.h> 12 #include <vector> 13 using namespace std; 14 #pragma comment(linker, "/STACK:1024000000,1024000000") 15 #define ll __int64 16 #define CL(a,b) memset(a,b,sizeof(a)) 17 #define MAXNODE 100010 18  19 int n,q; 20  21 typedef struct myedge 22 { 23     int v,next,p; 24 }E; 25  26 E edge[MAXNODE*2]; 27 int head[MAXNODE],ce; 28  29 void inithead() 30 { 31     CL(head,-1); 32     ce=0; 33 } 34 void addedge(int s,int e,int p) 35 { 36     edge[ce].p=p;edge[ce].v=e;edge[ce].next=head[s];head[s]=ce++; 37     edge[ce].p=p;edge[ce].v=s;edge[ce].next=head[e];head[e]=ce++; 38 } 39  40 typedef struct opedge 41 { 42     int v,t,k,p,next; 43 }O; 44  45 O op[MAXNODE*2]; 46 int heado[MAXNODE],co; 47 int etn[MAXNODE]; 48  49 void initheado() 50 { 51     CL(heado,-1); 52     CL(etn,0); 53     co=0; 54 } 55  56 void addo(int s,int e,int t,int k,int p) 57 { 58     op[co].t=t;op[co].v=e;op[co].next=heado[s];op[co].p=p;op[co].k=k;heado[s]=co++; 59     op[co].t=t;op[co].v=s;op[co].next=heado[e];op[co].p=p;op[co].k=k;heado[e]=co++; 60 } 61  62 int fa[MAXNODE]; 63 int fifa(int i) 64 { 65     if(fa[i]==i)return i; 66     fa[i]=fifa(fa[i]); 67     return fa[i]; 68 } 69  70 int pre[MAXNODE]; 71 int tagp[MAXNODE]; 72 ll  re[MAXNODE][2]; 73 int tag[MAXNODE]; 74  75 void initdfs() 76 { 77     CL(pre,-1); 78     CL(tagp,0); 79     CL(tag,0); 80     CL(re,0); 81     for(int i=0;i<MAXNODE;i++)fa[i]=i; 82 } 83  84 void dfsad(int i,int pr) 85 { 86     pre[i]=pr; 87     int p=head[i],v,t,k,pos,rt; 88     while(p!=-1) 89     { 90         v=edge[p].v; 91         if(pre[v]==-1) 92         { 93             etn[edge[p].p]=v; 94             dfsad(v,i); 95         } 96         p=edge[p].next; 97     } 98     tag[i]=1; 99     p=heado[i];100     while(p!=-1)101     {102         v=op[p].v;103         t=op[p].t;104         k=op[p].k;105         rt=fifa(v);106         if(tag[v]==1&&tagp[op[p].p]==0)107         {108             re[i][t]+=k;re[v][t]+=k;109             re[rt][t]-=k;110             if(t==0)111             {112                 re[pre[rt]][t]-=k;113             }114             else re[rt][t]-=k;115             tagp[op[p].p]=1;116         }117         p=op[p].next;118     }119     fa[i]=pr;120 }121 122 void dfs(int i,int pr)123 {124     tag[i]=1;125     int p=head[i],v;126     while(p!=-1)127     {128         v=edge[p].v;129         if(tag[v]==0)dfs(v,i);130         p=edge[p].next;131     }132     re[pr][0]+=re[i][0];133     re[pr][1]+=re[i][1];134 }135 136 char opt[10];137 138 int main()139 {140     int tt,ii;141     cin>>tt;142     for(ii=1;ii<=tt;ii++)143     {144         scanf("%d %d",&n,&q);145         int i,j,a,b,k;146         inithead();147         initheado();148         initdfs();149         for(i=1;i<n;i++)150         {151             scanf("%d %d",&a,&b);152             addedge(a,b,i);153         }154         for(i=1;i<=q;i++)155         {156             scanf("%s %d %d %d",opt,&a,&b,&k);157             {158                 if(opt[3]==1)159                 {160                     addo(a,b,0,k,i);161                 }162                 else163                 {164                     addo(a,b,1,k,i);165                 }166             }167         }168         dfsad(1,0);169         CL(tag,0);170         dfs(1,0);171         printf("Case #%d:\n",ii);172         for(i=1;i<=n;i++)173         {174             if(i!=1)printf(" ");175             printf("%I64d",re[i][0]);176         }cout<<endl;177         for(i=1;i<n;i++)178         {179             if(i!=1)printf(" ");180             printf("%I64d",re[etn[i]][1]);181         }cout<<endl;182     }183     return 0;184 }

 

HDU 5044 离线LCA算法