首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

POJ 1986 LCA模板增强点的

2012-10-20 
POJ 1986 LCA模板加强点的题意算是见过的最龌龊的了,你妹的,都不知道一共有多少个顶点,RE几次后立马把数组

POJ 1986 LCA模板加强点的

题意算是见过的最龌龊的了,你妹的,都不知道一共有多少个顶点,RE几次后立马把数组开到10W级别的;

#include<cstdio>#include<string.h>#include<algorithm>#include<vector>#include<stdlib.h>#include<cmath>#include<queue>#include<set>#include<map>#include<list>using namespace std;const int N=100015; struct node { int u,next,w; }edge[N*2],Q[N]; int father[N],dist[N],ance[N],head[N],st,et,qhead[N],res[N]; bool flag[N],vis[N]; int find(int x) {  return x==father[x]?x:father[x]=find(father[x]); } void add(int u,int v,int val) { edge[st].u=v; edge[st].next=head[u]; edge[st].w=val; head[u]=st++; } void Qadd(int u,int v,int i) { Q[et].u=v; Q[et].next=qhead[u]; Q[et].w=i; qhead[u]=et++; } void dfs(int u,int  val) {    dist[u]=val;     ance[u]=u;      vis[u]=true;  for(int i=head[u];i!=-1;i=edge[i].next)   {  if(!vis[edge[i].u])  {    dfs(edge[i].u,edge[i].w+val);    father[find(edge[i].u)]=find(u);      ance[find(u)]=u;  }   }     flag[u]=true;   for(int i=qhead[u];i!=-1;i=Q[i].next)   {   if(flag[Q[i].u])   {     res[Q[i].w]=dist[u]+dist[Q[i].u]-2*dist[ance[find(Q[i].u)]];   }   } } void init() { st=0;     et=0;  memset(head,-1,sizeof(head));  memset(qhead,-1,sizeof(qhead));  memset(flag,false,sizeof(flag));  memset(ance,0,sizeof(ance));  memset(dist,0,sizeof(dist));  memset(res,0,sizeof(res));  memset(vis,false,sizeof(vis));   } int main() {int n,k;while(~scanf("%d%d",&n,&k)){init();  for(int i=0;i<=n;i++)   {    father[i]=i;   }  int u,v,val;  char op[3];  while(k--)  {   scanf("%d %d %d %s",&u,&v,&val,op);   add(u,v,val);   add(v,u,val);  }  int t;  scanf("%d",&t);  for(int i=0;i<t;i++)  {   scanf("%d%d",&u,&v);   Qadd(u,v,i);   Qadd(v,u,i);  }  dfs(1,0);  for(int i=0;i<t;i++)  {   printf("%d\n",res[i]);  }} return 0; }


热点排行