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

#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 道路修建-美国的更多相关文章

  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. 集训Day13

    我这个肥宅一点都不快乐嘤嘤嘤 bzoj3456 求n个点的无向简单连通图的个数 我们可以用容斥推出递推式 首先我们令为 于是有 这样就是可以用CDQ分治解决的一类递推式了 不是那么明显的变形一下得到 ...

  2. BZOJ_3124_[Sdoi2013]直径_树形DP

    BZOJ_3124_[Sdoi2013]直径_树形DP Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵 ...

  3. js 图片上传

    可能很多不熟悉的图片上传的同学会觉得有点懵,其实做过一次你就会发现特别的简单. 只是一个formData格式的表单提交,把地址写到 action = "" 里面就可以了,当然你可以 ...

  4. gitea (git服务器), 修改配置,更换IP地址

    使用的gitea项目管理git 服务器 (可以不用备份项目, 通过直接修改gitea配置, 直接使用) 步骤1 可以直接访问项目, 步骤2 ,如果已有项目IP地址固定为192.168.1.x, 新的I ...

  5. python接口测试,第三方包xlrd和xlutils,怎么安装

    第1个:xlrd的下载地址:https://pypi.python.org/pypi/xlrd/0.9.2 安装过程:下载后解压文件夹,使用cd命令行进入该文件夹后,用命令:python setup. ...

  6. JavaScript高级程序设计学习笔记第八章--BOM

    1.间歇调用和超时调用: 超时调用:需要使用 window 对象的 setTimeout()方法,它接受两个参数:要执行的代码和以毫秒表示的时间(即在执行代码前需要等待多少毫秒).其中,第一个参数可以 ...

  7. HDU 1532 Drainage Ditches (网络流)

    A - Drainage Ditches Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  8. girdspec实现画布

    对于简单的画布可以很轻松的使用subplot解决,可是对于一些复杂的画布比如下面的这个 就不易使用subplot解决,这是就需要subplot的扩展版gridspec 构造函数GridSpec(nro ...

  9. android studio 改包名

    使用Android studio有一段时间了,但是每次修改包名的时候都是用一种简单粗暴的方式,那就是新建一个想要的包名,然后直接拖拽. 但是这样有个不好的地方就是每次都要去修改manifest.xml ...

  10. OpenGL学习笔记——求值器和NURBS

    http://codercdy.com/openglxue-xi-bi-ji-qiu-zhi-qi-he-nurbs/ 在最底层,图形硬件所绘制的是点.直线和多边形(通常是三角形和四边形).平滑的曲线 ...