bzoj1509[NOI2003] 逃学的小孩
来源:互联网 发布:网络之神级炼妖师 编辑:程序博客网 时间:2024/04/29 11:58
题目链接:bzoj1509
题目大意:
给你一棵树。让你找三个点x,y,z。求从一个点x出发,先到另外两个点中距离x较近的点(设为)y,再到剩下的那个点z,的时间。即max(dis(x,y),dis(y,z))。
题解:
树的直径。理应是树形dp,dfs也可以。
最坏情况下就是花得时间最长。那么直径(u,v)一定含在路径中。然后再选一个min(dis(u,x),dis(v,u))最大的点加上直径就是答案。
虽说是treedp但是我直接打了n个dfs了。感觉方便点啊。
怎么求直径:
随便从一个点出发到离他最远的点u,该点一定是直径的一端。再从u出发到离他最远的点v。u->v就是该树的直径。
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef long long LL;#define maxn 200010struct node{ int x,y,next;LL c;}a[maxn*2];int len,first[maxn];LL ans,d[maxn];int u,v,fa[maxn];bool mk[maxn];LL mymax(LL x,LL y){return (x>y)?x:y;}LL mymin(LL x,LL y){return (x<y)?x:y;}void ins(int x,int y,LL c){ len++;a[len].x=x;a[len].y=y;a[len].c=c; a[len].next=first[x];first[x]=len;}int dfs(int x){ int as=x; for (int k=first[x];k!=-1;k=a[k].next) { int y=a[k].y; if (y==fa[x]) continue; d[y]=d[x]+a[k].c;fa[y]=x; int p=dfs(y); if (d[p]>d[as]) as=p; } return as;}void mark(int x){ while (x!=u) { mk[x]=true; x=fa[x]; }mk[x]=true;}LL godown(int x){ LL ret=0; for (int k=first[x];k!=-1;k=a[k].next) { int y=a[k].y; if (y==fa[x]) continue; ret=mymax(ret,godown(y)+a[k].c); }return ret;}void fan(int x){ if (x!=u && x!=v) ans=mymax(ans,mymin(d[x],d[v]-d[x])); for (int k=first[x];k!=-1;k=a[k].next) { int y=a[k].y; if (y==fa[x]) continue; if (!mk[y]) ans=mymax(ans,a[k].c+godown(y)+mymin(d[x],d[v]-d[x])); else fan(y); }}int main(){ //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); int n,i,m,x,y;LL c; scanf("%d%d",&n,&m); len=0;memset(first,-1,sizeof(first)); for (i=1;i<=m;i++) { scanf("%d%d%lld",&x,&y,&c); ins(x,y,c);ins(y,x,c); mk[i]=false; }mk[n]=false; fa[1]=0;d[1]=0;u=dfs(1); fa[u]=0;d[u]=0;v=dfs(u); mark(v);ans=0;fan(u); ans+=d[v];printf("%lld\n",ans); return 0;}
1 0
- BZOJ1509: [NOI2003]逃学的小孩
- BZOJ1509: [NOI2003]逃学的小孩
- bzoj1509[NOI2003] 逃学的小孩
- bzoj1509: [NOI2003]逃学的小孩
- bzoj1509: [NOI2003]逃学的小孩
- 【bzoj1509】 NOI2003 逃学的小孩 树的直径
- [bzoj1509][NOI2003]逃学的小孩 树的直径
- NOI2003(bzoj1509)逃学的小孩(树型dp,好题)
- [BZOJ1509][NOI2003]逃学的小孩(树形dp||dfs)
- [BZOJ1509][NOI2003]逃学的小孩(链上乱搞)
- 1509: [NOI2003]逃学的小孩
- 1509: [NOI2003]逃学的小孩
- BZOJ 1509: [NOI2003]逃学的小孩
- NOI03 逃学的小孩
- NOI 2003 逃学的小孩
- bzoj 1509 逃学的小孩
- bzoj 1509 逃学的小孩
- NOI 2003 逃学的小孩【树形DP】
- 剪气球串
- mysql查重笔记
- 一个矩形能否放到另一个矩形内(公式)
- 2016蓝桥杯第九题
- 关于此实现不是 Windows 平台 FIPS 验证的加密算法的一部分。error
- bzoj1509[NOI2003] 逃学的小孩
- springmvc 拦截器 与 servlet filter比较
- 时间复杂度——我理解的那种
- PAT-A1130. 二叉树-中序遍历 变形输出
- OpenCV中使用的文件路径问题
- 多通道协议与应用层网关
- 【闲聊】人生如梦,一樽还酹江月
- 《TCP/IP详解卷一:协议》学习笔记二
- 范德蒙德恒等式