http://www.tyvj.cn/p/4878道路修建

我想我经大神点拨后终于明白了。。。回学校再写吧

时间限制:1s

内存限制:256MB

【问题述】

A国是一个商业高度发达的国家。它包含了n座城市,每座城商业都很发达。但不幸的是,A国的交通并没有像其商业那么发达,它仅仅保证了任意两座城市之间有路径存在,而且只存在唯一的一条!

拥有雄厚经济实力的商人们决定集资修建一条路,但在修建方案上各个商人都希望新建成的道路对自己利益最大。最终他们决定造一条路,使得两个城市间所需经过道路的数量的最大值尽可能小。为此他们提出了很多修建方案,但他们并不知道每一方案新建道路后最远城市间的最大值为多少,他们有多种修建方案,你能告诉他们每一方案对应的最远城市间的最大值吗?

【输入】

输入文件名为road.in。

第一行两个数n,m(1<=n、m<=3,000),分别表示城市个数和方案个数

接下来n-1行,每行两个数x、y,表示有一条道路连接x号城市和y号城市

m下来m行,每行两个数a、b,表示一个修建方案对应的两个城市

【输出】

输出文件名为road.out。

对于每组数据输出一行,包含一个数,表示新建道路后,最远城市间所需经过的道路数量

【输入输出样例】

road.in

road.out

8 2

1 3

2 3

3 4

4 5

5 6

6 7

6 8

3 6

1 8

3

5 更正

【数据说明】

对于40%的数据,1<=n,m<=300;

对于另外20%的数据,数据呈一条链

对于100%的数据,1<=n,m<=3000

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<vector>
  5. #include<algorithm>
  6. #include<cstring>
  7. using namespace std;
  8. const int N=;
  9. int n,m;
  10. int h[N],nex[N*],to[N*],cnt;
  11. int f[N];
  12. bool vis[N];
  13. int dep[N],deep[N];
  14. int max_son[N];
  15. int maxn,root;
  16. void Add(int x,int y)
  17. {
  18. to[++cnt]=y,nex[cnt]=h[x],h[x]=cnt;
  19. return;
  20. }
  21. void dfs1(int x,int tot)
  22. {
  23. vis[x]=;
  24. for(int i=h[x];i;i=nex[i])
  25. if(!vis[to[i]])
  26. dfs1(to[i],tot+);
  27. if(tot>maxn) maxn=tot,root=x;
  28. return ;
  29. }
  30. int dfs2(int x,int tot,int last)
  31. {
  32. vis[x]=;f[x]=last;dep[x]=tot;
  33. int sum=;
  34. for(int i=h[x];i;i=nex[i])
  35. if(vis[to[i]])
  36. sum=max(sum,dfs2(to[i],tot+,x));
  37. sum=max(sum,tot);
  38. maxn=max(maxn,sum);
  39. max_son[x]=sum;
  40. return sum;
  41. }
  42. void work(int u,int v)
  43. {
  44. int t,len,ans=;
  45. if(dep[u]>=dep[v])
  46. t=u;else
  47. if(dep[v]>dep[u])
  48. t=v;
  49. int minn=min(dep[v],dep[u]);
  50. ans=dep[f[t]];
  51. ans=max(ans,(minn+));
  52. cout<<ans<<endl;
  53. return ;
  54. }
  55. int main()
  56. {
  57. scanf("%d%d",&n,&m);
  58. for(int i=,x,y;i<n;i++)
  59. {
  60. scanf("%d%d",&x,&y);
  61. Add(x,y);Add(y,x);
  62. }
  63. f[]=;
  64. dfs1(,);
  65. maxn=;
  66. dfs2(root,,);
  67. for(int i=,u,v;i<=m;i++)
  68. {
  69. scanf("%d%d",&u,&v);
  70. work(u,v);
  71. }
  72. return ;
  73. }
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<vector>
  5. #include<algorithm>
  6. #include<cstring>
  7. using namespace std;
  8. const int N=;
  9. int n,m;
  10. int h[N],nex[N*],to[N*],cnt;
  11. int f[N];
  12. bool vis[N];
  13. int dep[N],deep[N];
  14. int max_son[N];
  15. int maxn,root;
  16. void Add(int x,int y)
  17. { to[++cnt]=y,nex[cnt]=h[x],h[x]=cnt;}
  18. void dfs1(int x,int tot)
  19. {
  20. vis[x]=;
  21. for(int i=h[x];i;i=nex[i])
  22. if(!vis[to[i]])
  23. dfs1(to[i],tot+);
  24. if(tot>maxn) maxn=tot,root=x;
  25. return ;
  26. }
  27. int dfs2(int x,int tot,int last)
  28. {
  29. vis[x]=;f[x]=last;dep[x]=tot;
  30. int sum=;
  31. for(int i=h[x];i;i=nex[i])
  32. if(vis[to[i]])
  33. sum=max(sum,dfs2(to[i],tot+,x));
  34. sum=max(sum,tot);
  35. maxn=max(maxn,sum);
  36. max_son[x]=sum;
  37. return sum;
  38. }
  39. void work(int u,int v)
  40. {
  41. int t,len,ans=,last;
  42. if(dep[u]>=dep[v])
  43. t=u;else
  44. if(dep[v]>dep[u])
  45. t=v;
  46. int minn=min(dep[v],dep[u]);
  47. /*
  48. if(max_son[t]!=maxn)
  49. {
  50. printf("%d\n",maxn);
  51. return;
  52. }else
  53. {
  54. int ans;
  55. ans=maxn-(dep[t]-minn)+1;
  56. ans=max(ans,minn+1+(dep[t]-minn)/2);
  57. printf("%d\n",ans);
  58. return ;
  59. }
  60. */
  61. /*
  62. len=minn+1;last=t;
  63. ans=max_son[t]-(dep[t]-minn)+1;
  64. while(dep[t]>len)
  65. {
  66. for(int i=h[t];i;i=nex[i])
  67. if((to[i]!=f[t])&&(to[i]!=last))
  68. {
  69. ans=max(ans,max_son[to[i]]-(dep[t]-len));
  70. }
  71. last=t;t=f[t];len++;
  72. }
  73. */
  74. ans=dep[f[t]];
  75.  
  76. printf("%d\n",ans);
  77. return ;
  78. }
  79. int main()
  80. {
  81. scanf("%d%d",&n,&m);
  82. for(int i=,x,y;i<n;i++)
  83. {
  84. scanf("%d%d",&x,&y);
  85. Add(x,y);Add(y,x);
  86. }
  87. f[]=;
  88. dfs1(,);
  89. maxn=;
  90. dfs2(root,,);
  91. for(int i=,u,v;i<=m;i++)
  92. {
  93. scanf("%d%d",&u,&v);
  94. work(u,v);
  95. }
  96. return ;
  97. }
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<vector>
  5. #include<algorithm>
  6. #include<cstring>
  7. using namespace std;
  8. const int N=;
  9. int n,m;
  10. int h[N],nex[N*],to[N*],cnt;
  11. int f[N];
  12. bool vis[N];
  13. int dep[N],deep[N];
  14. int max_son[N];
  15. int maxn,root;
  16. void Add(int x,int y)
  17. {
  18. to[++cnt]=y,nex[cnt]=h[x],h[x]=cnt;
  19. return;
  20. }
  21. void dfs1(int x,int tot)
  22. {
  23. vis[x]=;
  24. for(int i=h[x];i;i=nex[i])
  25. if(!vis[to[i]])
  26. dfs1(to[i],tot+);
  27. if(tot>maxn) maxn=tot,root=x;
  28. return ;
  29. }
  30. int dfs2(int x,int tot,int last)
  31. {
  32. vis[x]=;f[x]=last;dep[x]=tot;
  33. int sum=;
  34. for(int i=h[x];i;i=nex[i])
  35. if(vis[to[i]])
  36. sum=max(sum,dfs2(to[i],tot+,x));
  37. sum=max(sum,tot);
  38. maxn=max(maxn,sum);
  39. max_son[x]=sum;
  40. return sum;
  41. }
  42. void work(int u,int v)
  43. {
  44. int t,len,ans=;
  45. if(dep[u]>=dep[v])
  46. t=u;else
  47. if(dep[v]>dep[u])
  48. t=v;
  49. int minn=min(dep[v],dep[u]);
  50. len=minn+;
  51. ans=minn+;
  52. ans=max(ans,max_son[t]-(dep[t]-minn-));
  53. while(dep[t]>len)
  54. {
  55. ans=max(ans,max_son[t]-(dep[t]-len));
  56. len++,t=f[t];
  57. }
  58.  
  59. return ;
  60. }
  61. int main()
  62. {
  63. scanf("%d%d",&n,&m);
  64. for(int i=,x,y;i<n;i++)
  65. {
  66. scanf("%d%d",&x,&y);
  67. Add(x,y);Add(y,x);
  68. }
  69. f[]=;
  70. dfs1(,);
  71. maxn=;
  72. dfs2(root,,);
  73. for(int i=,u,v;i<=m;i++)
  74. {
  75. scanf("%d%d",&u,&v);
  76. work(u,v);
  77. }
  78. return ;
  79. }

P4878 道路修建-美国的更多相关文章

  1. 【BZOJ-2435】道路修建 (树形DP?)DFS

    2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3115  Solved: 1002[Submit][Statu ...

  2. 【bzoj2435】[NOI2011]道路修建

    题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. 每条道路的修 ...

  3. 【NOI2011】道路修建 BFS

    [NOI2011]道路修建 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建 ...

  4. 【BZOJ】2435: [Noi2011]道路修建(树形dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2435 我怎么感觉那么水.. 坑的是,dfs会爆...好吧..用bfs.. //upd:我的智商也是醉 ...

  5. bzoj 2435: [Noi2011]道路修建 树上 dp

    2435: [Noi2011]道路修建 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  6. 2435: [Noi2011]道路修建 - BZOJ

    Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. ...

  7. NOI2011道路修建

    2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1974  Solved: 550[Submit][Status ...

  8. BZOJ 2435: [Noi2011]道路修建( dfs )

    NOI的水题...直接一遍DFS即可 ------------------------------------------------------------------------- #includ ...

  9. 道路修建 2(自创题+题解)(From NOI2011)

    道路修建这道题想来各位不陌生(传送门在此——Bzoj2435),看了此题,一开始以为是最初各个点处于分散状态,然后做了一下,直到发现标程都有点问题,才发现原题是说本来各点已经处于连接完毕的状态(phi ...

随机推荐

  1. BLE Mesh网络协议综述

    0 引言 自2012年蓝牙4.0规范推出之后,全新的蓝牙低功耗(BLE)技术由于其极低的运行和待机功耗.低成本和跨厂商互操作性,3 ms低延迟.AES-128加密等诸多特色,可以用于计步器.心律监视器 ...

  2. Maximum Cardinality Bipartite Matching: Augmenting Path Algorithm

    http://www.csie.ntnu.edu.tw/~u91029/Matching.html int nx,ny; int mx[N],my[N]; bool vy[N]; bool g[N][ ...

  3. Java之匿名类讲解

    参考https://blog.csdn.net/jiaotuwoaini/article/details/51542059 匿名类,正如名字一样在java中没有名字标识的类,当然了编译后还是会安排一个 ...

  4. HDU - 5094 Maze(状压+bfs)

    Maze This story happened on the background of Star Trek. Spock, the deputy captain of Starship Enter ...

  5. 51nod1117【贪心】

    思路:哈夫曼树~~哇塞,那么有道理. 利用堆维护:每次从堆里取两个最小加起来,然后还是最小的两个,最后只剩一根总的 #include <bits/stdc++.h> using names ...

  6. 2014-9-13 NOIP模拟赛

    NOIP2014模拟赛 ——lwher 题目名 环上的游戏 舞蹈课 数位和乘积 源文件 cycle.cpp/c/pas dancingLessons.pas/cpp digit.cpp.cpp/c/p ...

  7. uoj#280. 【UTR #2】题目难度提升(构造)

    传送门 咱先膜一下\(GXZ\)再说 我们先把序列从小到大排序,然后分情况讨论 无解是不存在的,从小到大输出所有数肯定可行 情况一,如果\(a[mid]=a[mid+1]\),因为最终的中位数也是它们 ...

  8. 洛谷P4052 [JSOI2007]文本生成器(AC自动机)

    传送门 好像这题的确只能用AC自动机做了……Aufun大佬太强啦 正着难我们反着做,用总共单词个数减去没有一个单词都不包含的 然后考虑怎么处理一个单词都不包含的,就是跑不到单词的结尾节点 定义$f[i ...

  9. Canesten 项目申请ICP备案过程中遇到的问题及知识点扩充

    遇到的问题:Canesten备案主体是Bayer *** Ltd., Shanghai Branch, 而提供的IP是 Bayer (China)limited,违背了电信要求的三一致原则,即备案主体 ...

  10. Python学习笔记(数据处理)

    处理文件中数据 (统计分数) 看一下我们的文档里的数据: #-- scores.txt 刘备 23 35 44 47 51 关羽 60 77 68 张飞 97 99 89 91 诸葛亮 100 1.先 ...