hdu 6115(LCA 暴力)

Factory

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)
Total Submission(s): 367    Accepted Submission(s): 124

Problem Description
我们将A省简化为由N个城市组成,某些城市之间存在双向道路,而且A省的交通有一个特点就是任意两个城市之间都能通过道路相互到达,且在不重复经过城市的情况下任意两个城市之间的到达方案都是唯一的。聪明的你一定已经发现,这些城市构成了树这样一个结构。

现在百度陆续开了许许多多的子公司。每家子公司又会在各城市中不断兴建属于该子公司的办公室。

由于各个子公司之间经常有资源的流动,所以公司员工常常想知道,两家子公司间的最小距离。
我们可以把子公司看成一个由办公室组成的集合。那么两个子公司A和B的最小距离定义为min(dist(x,y))(x∈A,y∈B)。其中dist(x,y)表示两个办公室之间的最短路径长度。
现在共有Q个询问,每次询问分别在两个子公司间的最小距离。
Input
第一行一个正整数T,表示数据组数。
对于每组数据:
第一行两个正整数N和M。城市编号为1至N,子公司编号为1至M。
接下来N-1行给定所有道路的两端城市编号和道路长度。
接下来M行,依次按编号顺序给出各子公司办公室所在位置,每行第一个整数G,表示办公室数,接下来G个数为办公室所在位置。
接下来一个整数Q,表示询问数。
接下来Q行,每行两个正整数a,b(a不等于b),表示询问的两个子公司。
【数据范围】
0<=边权<=100
1<=N,M,Q,工厂总数<=100000
Output
对于每个询问,输出一行,表示答案。
Sample Input
1
3 3
1 2 1
2 3 1
2 1 1
2 2 3
2 1 3
3
1 2
2 3
1 3
Sample Output
1
0
0
Source
都是暴力可以过 我知道为什么 我的就是wa  先贴上来 有空改下 这是错的代码  找不到错 好像是LCA的板子有问题
这题难道暴力不超时吗
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cmath>
  4 #include<map>
  5 #include<cstdlib>
  6 #include<vector>
  7 #include<set>
  8 #include<queue>
  9 #include<cstring>
 10 #include<string.h>
 11 #include<algorithm>
 12 typedef long long ll;
 13 typedef unsigned long long LL;
 14 const int INF=1e9;
 15 using namespace std;
 16 const int N=200000+100;
 17 int head[N];
 18 int cnt;
 19 int vis[N];
 20 int dis[N];
 21 vector<int>vc[N];
 22 int d[N],dp[N][30];
 23 struct node{
 24     int to,next,w;
 25 }edge[2*N];
 26 int t1;
 27 int pos[N],dep[N],f[N];
 28 void init(){
 29     for(int i=1;i<N;i++)vc[i].clear();
 30     cnt=0;
 31     memset(head,-1,sizeof(head));
 32     memset(pos,-1,sizeof(pos));
 33     memset(dis,0,sizeof(dis));
 34     t1=0;
 35 }
 36 void add(int u,int v,int w){
 37     edge[cnt].to=v;
 38     edge[cnt].w=w;
 39     edge[cnt].next=head[u];
 40     head[u]=cnt++;
 41 }
 42 void init_RMQ(int n){
 43     for(int i=1;i<=n;i++)dp[i][0]=i;
 44     for(int j=1;(1<<j)<=n;j++)
 45     for(int i=1;i+(1<<j)-1<=n;i++)
 46     if(dep[dp[i][j-1]]<dep[dp[i+(1<<j-1)][j-1]])dp[i][j]=dp[i][j-1];
 47     else
 48         dp[i][j]=dp[i+(1<<j-1)][j-1];
 49         //dp[i][j]=min(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
 50 }
 51 int RMQ(int l,int r){
 52     int k=0;
 53     while((1<<k+1)<=r-l+1)k++;
 54     if(dep[dp[l][k]]<dep[dp[r-(1<<k)+1][k]])return dp[l][k];
 55     else
 56         return dp[r-(1<<k)+1][k];
 57     //return min(dep[dp[l][k]],dep[dp[r-(1<<k)+1][k]]);
 58 }
 59 int lca(int u,int v){
 60     if(pos[u]>pos[v])return f[RMQ(pos[v],pos[u])];
 61     else
 62         return f[RMQ(pos[u],pos[v])];
 63 }
 64 void DFS(int x,int deep){
 65     f[t1]=x;
 66     dep[t1]=deep;
 67     pos[x]=t1++;
 68     for(int i=head[x];i!=-1;i=edge[i].next){
 69         int v=edge[i].to;
 70         if(pos[v]==-1){
 71             dis[v]=dis[x]+edge[i].w;
 72             DFS(v,deep+1);
 73             f[t1]=x;
 74             dep[t1++]=deep;
 75         }
 76 
 77     }
 78 }
 79 int main(){
 80     int t;
 81     scanf("%d",&t);
 82     while(t--){
 83         init();
 84         //memset(dis,0,sizeof(dis));
 85         int n,m;
 86         scanf("%d%d",&n,&m);
 87         for(int i=1;i<=n-1;i++){
 88             int u,v,w;
 89             scanf("%d%d%d",&u,&v,&w);
 90             add(u,v,w);
 91             add(v,u,w);
 92         }
 93         init_RMQ(3*n-1);
 94         DFS(1,0);
 95         for(int i=2;i<=n;i++){
 96             cout<<dis[i]<<endl;
 97         }
 98         for(int i=1;i<=m;i++){
 99             int tt;
100             scanf("%d",&tt);
101             for(int j=1;j<=tt;j++){
102                 int x;
103                 scanf("%d",&x);
104                 vc[i].push_back(x);
105             }
106         }
107         int q;
108         scanf("%d",&q);
109         while(q--){
110             int a,b;
111             scanf("%d%d",&a,&b);
112             int ans=INF;
113             for(int i=0;i<vc[a].size();i++)
114             for(int j=0;j<vc[b].size();j++){
115                 int u=vc[a][i];
116                 int v=vc[b][j];
117                 int tt=lca(u,v);
118                 ans=min(ans,abs(dis[u]+dis[v]-2*dis[tt]));
119             }
120             cout<<ans<<endl;
121         }
122 
123     }
124 
125 }

 

posted on 2017-08-15 08:27  见字如面  阅读(365)  评论(0编辑  收藏  举报

导航