P4878 道路修建-美国
我想我经大神点拨后终于明白了。。。回学校再写吧
时间限制: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
- #include<iostream>
- #include<cstdio>
- #include<queue>
- #include<vector>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- const int N=;
- int n,m;
- int h[N],nex[N*],to[N*],cnt;
- int f[N];
- bool vis[N];
- int dep[N],deep[N];
- int max_son[N];
- int maxn,root;
- void Add(int x,int y)
- {
- to[++cnt]=y,nex[cnt]=h[x],h[x]=cnt;
- return;
- }
- void dfs1(int x,int tot)
- {
- vis[x]=;
- for(int i=h[x];i;i=nex[i])
- if(!vis[to[i]])
- dfs1(to[i],tot+);
- if(tot>maxn) maxn=tot,root=x;
- return ;
- }
- int dfs2(int x,int tot,int last)
- {
- vis[x]=;f[x]=last;dep[x]=tot;
- int sum=;
- for(int i=h[x];i;i=nex[i])
- if(vis[to[i]])
- sum=max(sum,dfs2(to[i],tot+,x));
- sum=max(sum,tot);
- maxn=max(maxn,sum);
- max_son[x]=sum;
- return sum;
- }
- void work(int u,int v)
- {
- int t,len,ans=;
- if(dep[u]>=dep[v])
- t=u;else
- if(dep[v]>dep[u])
- t=v;
- int minn=min(dep[v],dep[u]);
- ans=dep[f[t]];
- ans=max(ans,(minn+));
- cout<<ans<<endl;
- return ;
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- for(int i=,x,y;i<n;i++)
- {
- scanf("%d%d",&x,&y);
- Add(x,y);Add(y,x);
- }
- f[]=;
- dfs1(,);
- maxn=;
- dfs2(root,,);
- for(int i=,u,v;i<=m;i++)
- {
- scanf("%d%d",&u,&v);
- work(u,v);
- }
- return ;
- }
- #include<iostream>
- #include<cstdio>
- #include<queue>
- #include<vector>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- const int N=;
- int n,m;
- int h[N],nex[N*],to[N*],cnt;
- int f[N];
- bool vis[N];
- int dep[N],deep[N];
- int max_son[N];
- int maxn,root;
- void Add(int x,int y)
- { to[++cnt]=y,nex[cnt]=h[x],h[x]=cnt;}
- void dfs1(int x,int tot)
- {
- vis[x]=;
- for(int i=h[x];i;i=nex[i])
- if(!vis[to[i]])
- dfs1(to[i],tot+);
- if(tot>maxn) maxn=tot,root=x;
- return ;
- }
- int dfs2(int x,int tot,int last)
- {
- vis[x]=;f[x]=last;dep[x]=tot;
- int sum=;
- for(int i=h[x];i;i=nex[i])
- if(vis[to[i]])
- sum=max(sum,dfs2(to[i],tot+,x));
- sum=max(sum,tot);
- maxn=max(maxn,sum);
- max_son[x]=sum;
- return sum;
- }
- void work(int u,int v)
- {
- int t,len,ans=,last;
- if(dep[u]>=dep[v])
- t=u;else
- if(dep[v]>dep[u])
- t=v;
- int minn=min(dep[v],dep[u]);
- /*
- if(max_son[t]!=maxn)
- {
- printf("%d\n",maxn);
- return;
- }else
- {
- int ans;
- ans=maxn-(dep[t]-minn)+1;
- ans=max(ans,minn+1+(dep[t]-minn)/2);
- printf("%d\n",ans);
- return ;
- }
- */
- /*
- len=minn+1;last=t;
- ans=max_son[t]-(dep[t]-minn)+1;
- while(dep[t]>len)
- {
- for(int i=h[t];i;i=nex[i])
- if((to[i]!=f[t])&&(to[i]!=last))
- {
- ans=max(ans,max_son[to[i]]-(dep[t]-len));
- }
- last=t;t=f[t];len++;
- }
- */
- ans=dep[f[t]];
- printf("%d\n",ans);
- return ;
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- for(int i=,x,y;i<n;i++)
- {
- scanf("%d%d",&x,&y);
- Add(x,y);Add(y,x);
- }
- f[]=;
- dfs1(,);
- maxn=;
- dfs2(root,,);
- for(int i=,u,v;i<=m;i++)
- {
- scanf("%d%d",&u,&v);
- work(u,v);
- }
- return ;
- }
- #include<iostream>
- #include<cstdio>
- #include<queue>
- #include<vector>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- const int N=;
- int n,m;
- int h[N],nex[N*],to[N*],cnt;
- int f[N];
- bool vis[N];
- int dep[N],deep[N];
- int max_son[N];
- int maxn,root;
- void Add(int x,int y)
- {
- to[++cnt]=y,nex[cnt]=h[x],h[x]=cnt;
- return;
- }
- void dfs1(int x,int tot)
- {
- vis[x]=;
- for(int i=h[x];i;i=nex[i])
- if(!vis[to[i]])
- dfs1(to[i],tot+);
- if(tot>maxn) maxn=tot,root=x;
- return ;
- }
- int dfs2(int x,int tot,int last)
- {
- vis[x]=;f[x]=last;dep[x]=tot;
- int sum=;
- for(int i=h[x];i;i=nex[i])
- if(vis[to[i]])
- sum=max(sum,dfs2(to[i],tot+,x));
- sum=max(sum,tot);
- maxn=max(maxn,sum);
- max_son[x]=sum;
- return sum;
- }
- void work(int u,int v)
- {
- int t,len,ans=;
- if(dep[u]>=dep[v])
- t=u;else
- if(dep[v]>dep[u])
- t=v;
- int minn=min(dep[v],dep[u]);
- len=minn+;
- ans=minn+;
- ans=max(ans,max_son[t]-(dep[t]-minn-));
- while(dep[t]>len)
- {
- ans=max(ans,max_son[t]-(dep[t]-len));
- len++,t=f[t];
- }
- return ;
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- for(int i=,x,y;i<n;i++)
- {
- scanf("%d%d",&x,&y);
- Add(x,y);Add(y,x);
- }
- f[]=;
- dfs1(,);
- maxn=;
- dfs2(root,,);
- for(int i=,u,v;i<=m;i++)
- {
- scanf("%d%d",&u,&v);
- work(u,v);
- }
- return ;
- }
P4878 道路修建-美国的更多相关文章
- 【BZOJ-2435】道路修建 (树形DP?)DFS
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3115 Solved: 1002[Submit][Statu ...
- 【bzoj2435】[NOI2011]道路修建
题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. 每条道路的修 ...
- 【NOI2011】道路修建 BFS
[NOI2011]道路修建 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建 ...
- 【BZOJ】2435: [Noi2011]道路修建(树形dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=2435 我怎么感觉那么水.. 坑的是,dfs会爆...好吧..用bfs.. //upd:我的智商也是醉 ...
- bzoj 2435: [Noi2011]道路修建 树上 dp
2435: [Noi2011]道路修建 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- 2435: [Noi2011]道路修建 - BZOJ
Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. ...
- NOI2011道路修建
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1974 Solved: 550[Submit][Status ...
- BZOJ 2435: [Noi2011]道路修建( dfs )
NOI的水题...直接一遍DFS即可 ------------------------------------------------------------------------- #includ ...
- 道路修建 2(自创题+题解)(From NOI2011)
道路修建这道题想来各位不陌生(传送门在此——Bzoj2435),看了此题,一开始以为是最初各个点处于分散状态,然后做了一下,直到发现标程都有点问题,才发现原题是说本来各点已经处于连接完毕的状态(phi ...
随机推荐
- BLE Mesh网络协议综述
0 引言 自2012年蓝牙4.0规范推出之后,全新的蓝牙低功耗(BLE)技术由于其极低的运行和待机功耗.低成本和跨厂商互操作性,3 ms低延迟.AES-128加密等诸多特色,可以用于计步器.心律监视器 ...
- 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][ ...
- Java之匿名类讲解
参考https://blog.csdn.net/jiaotuwoaini/article/details/51542059 匿名类,正如名字一样在java中没有名字标识的类,当然了编译后还是会安排一个 ...
- HDU - 5094 Maze(状压+bfs)
Maze This story happened on the background of Star Trek. Spock, the deputy captain of Starship Enter ...
- 51nod1117【贪心】
思路:哈夫曼树~~哇塞,那么有道理. 利用堆维护:每次从堆里取两个最小加起来,然后还是最小的两个,最后只剩一根总的 #include <bits/stdc++.h> using names ...
- 2014-9-13 NOIP模拟赛
NOIP2014模拟赛 ——lwher 题目名 环上的游戏 舞蹈课 数位和乘积 源文件 cycle.cpp/c/pas dancingLessons.pas/cpp digit.cpp.cpp/c/p ...
- uoj#280. 【UTR #2】题目难度提升(构造)
传送门 咱先膜一下\(GXZ\)再说 我们先把序列从小到大排序,然后分情况讨论 无解是不存在的,从小到大输出所有数肯定可行 情况一,如果\(a[mid]=a[mid+1]\),因为最终的中位数也是它们 ...
- 洛谷P4052 [JSOI2007]文本生成器(AC自动机)
传送门 好像这题的确只能用AC自动机做了……Aufun大佬太强啦 正着难我们反着做,用总共单词个数减去没有一个单词都不包含的 然后考虑怎么处理一个单词都不包含的,就是跑不到单词的结尾节点 定义$f[i ...
- Canesten 项目申请ICP备案过程中遇到的问题及知识点扩充
遇到的问题:Canesten备案主体是Bayer *** Ltd., Shanghai Branch, 而提供的IP是 Bayer (China)limited,违背了电信要求的三一致原则,即备案主体 ...
- Python学习笔记(数据处理)
处理文件中数据 (统计分数) 看一下我们的文档里的数据: #-- scores.txt 刘备 23 35 44 47 51 关羽 60 77 68 张飞 97 99 89 91 诸葛亮 100 1.先 ...