hdu 4679 Terrorist’s destroy 树的直径+dp
题意:给你一棵树,每条边都有值W,然后问你去掉一条边,令val = w*max(两颗新树的直径),求val最小值~
做法,先求树的直径,然后算出直径上每个点的最长枝条长度。这样对于每一条边,假如是枝条边,那么val = w*直径,如果不是那么val = max(w*(两颗新树的直径))。新树直径说到这里已经很好算了。
DFS爆栈了一下午
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <stack>
#define loop(s,i,n) for(i = s;i < n;i++)
#define cl(a,b) memset(a,b,sizeof(a))
#pragma comment(linker, "/STACK:1024000000,1024000000")
const int maxn = ;
using namespace std;
struct edge
{
int u,v,w,next;
}edges[*maxn];
struct node
{
int step,u,v;
}q[maxn*];
int maxp,cnt,n;
bool vis[maxn],is_on[maxn];
int set[maxn],head[maxn],dep[maxn],rdp[maxn],trans[maxn],rtrans[maxn],rp[maxn],lp[maxn]; void init()
{
int i;
for(i = ;i <= n;i++)
vis[i] = ,head[i] = -,is_on[i] = ,rdp[i] = ;
cnt = maxp= ;
dep[] = -;
}
void addedge(int u,int v,int w)
{
int i;
edges[cnt].u = u;
edges[cnt].v = v;
edges[cnt].w = w;
edges[cnt].next = head[u];
head[u] = cnt;
cnt++;
}
void dfs(int u,int deep,int pre)
{
set[u] = pre;
vis[u] = true;
dep[u] = deep;
if(dep[maxp] < dep[u])
maxp = u;
// printf("*****u*** %d ***\n",u);
int i;
for(i = head[u];i != -;i = edges[i].next)
{
int v;
v = edges[i].v;
if(vis[v] == false)
{
dfs(v,deep+,u);
}
}
}
void bfs(int s)
{
int i;
int maxs = ;
int r,f;
f = r = ;
struct node st;
st.u = s;
st.step = ;
set[s] = -;
q[r++] = st;
vis[s] = ;
while(f < r)
{
struct node tmp;
tmp = q[f];
f++;
int i;
for(i = head[tmp.u];i != -;i = edges[i].next)
{
int v;
v = edges[i].v;
if(!vis[v])
{
struct node t;
t.u = v;
t.step = tmp.step+;
if(maxs < t.step)
maxp = v,maxs = t.step;
vis[v] = true;
set[v] = tmp.u;
dep[v] = t.step;
q[r++] = t;
}
}
}
}
int main()
{
int t,icase;
//freopen("data.txt","r",stdin);
//freopen("data1.txt","w",stdout);
scanf("%d",&t);
icase = ;
while(t--)
{
// int n;
int i,j,u,v,w;
printf("Case #%d: ",++icase);
scanf("%d",&n);
init();
loop(,i,n-)
{
scanf("%d %d %d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
} // dfs(1,0,-1);
bfs(); for(i = ;i <= n;i++)
vis[i] = false;
int tmp;
tmp = maxp;
maxp = ;
//dfs(tmp,0,-1);
bfs(tmp); // /*
int num;
num = ;
while(maxp != -)
{
is_on[maxp] = ; trans[++num] = maxp;//没有初始化
rtrans[maxp] = num;
maxp = set[maxp];
} for(i = ;i <= n;i++)
{// if(!is_on[i])
{
u = i;
while(!is_on[u])
{
u = set[u];
}
if(rdp[u] < dep[i] - dep[u])
{
rdp[u] = dep[i]-dep[u];
}
}
} for(i = ;i <= num;i++)
{
if(i == )
rp[i] = rdp[trans[i]];
else
rp[i] = max(rp[i-],i-+rdp[trans[i]]);
}
for(i = num;i >= ;i--)
{
if(i == num)
lp[i] = rdp[trans[i]];
else
lp[i] = max(lp[i+],num-i+rdp[trans[i]]);
}
int ans,ansb;
ans = ;
ansb = -;
for(i = ;i < cnt;i+=)
{
u = edges[i].u;
v = edges[i].v;
w = edges[i].w;
int subans;
if(is_on[u] && is_on[v])
{
if(rtrans[u] > rtrans[v])
{
int tmp;
tmp = u,u = v,v =tmp;
} subans = max(rp[rtrans[u]],lp[rtrans[v]]);
if(ans > w*subans)
ans = w*subans,ansb = i/+; }
else
{
if(ans > w*(num-))
ans = w*(num-),ansb = i/+;
}
} //*/ //
printf("%d\n",ansb); }
return ;
}
hdu 4679 Terrorist’s destroy 树的直径+dp的更多相关文章
- hdu 4679 Terrorist’s destroy 树形DP
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4679 题意:给定一颗树,每条边有一个权值w,问切掉哪条边之后,分成的两颗树的较大的直径*切掉边的权值最小? ...
- HDU 4679 Terrorist’s destroy (2013多校8 1004题 树形DP)
Terrorist’s destroy Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- HDU 4679 Terrorist’s destroy
如果不在最长路的边,那么肯定是w*最长路. 如果在最长路,那么把最长路分成两段,左边树的最长路就是左段+左边点的次短路(不包含最长路上的点的最长路) ,右边同理. 还有就是更新,经过左端点的最长路,不 ...
- hdu 4607 Park Visit 求树的直径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...
- Hdu 4612 Warm up (双连通分支+树的直径)
题目链接: Hdu 4612 Warm up 题目描述: 给一个无向连通图,问加上一条边后,桥的数目最少会有几个? 解题思路: 题目描述很清楚,题目也很裸,就是一眼看穿怎么做的,先求出来双连通分量,然 ...
- hdu 4123 Bob’s Race 树的直径+rmq+尺取
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- F - Warm up - hdu 4612(缩点+求树的直径)
题意:有一个无向连通图,现在问添加一条边后最少还有几个桥 分析:先把图缩点,然后重构图为一棵树,求出来树的直径即可,不过注意会有重边,构树的时候注意一下 *********************** ...
- HDU 4123 Bob’s Race 树的直径+单调队列
题意: 给定n个点的带边权树Q个询问. 以下n-1行给出树 以下Q行每行一个数字表示询问. 首先求出dp[N] :dp[i]表示i点距离树上最远点的距离 询问u, 表示求出 dp 数组中最长的连续序列 ...
- F - Warm up HDU - 4612 tarjan缩点 + 树的直径 + 对tajan的再次理解
题目链接:https://vjudge.net/contest/67418#problem/F 题目大意:给你一个图,让你加一条边,使得原图中的桥尽可能的小.(谢谢梁学长的帮忙) 我对重边,tarja ...
随机推荐
- selenium 代理 Cookies 截图 等待 调用JS
改变用户代理 读取Cookies 调用Java Script Webdriver截图 页面等待 1. 改变用户代理 import org.junit.AfterClass; import org.ju ...
- postgresql 建模文件 LDM 转成PDM 生成 SQL问题
LDM 转成 PDM (Tool --- GPDM ) 生成 SQL,查看全部SQL 详细步骤见下图. 1.postgresql 没有 VARCHAR2 只有 VARCHAR. 2.LDM 生成 PD ...
- 了解Java应用中的开发攻击
注入式(Inject)攻击是一类非常常见的攻击方式,其基本特征是允许攻击者将不可信的动态内容注入到程序中,并将其执行,这就可能完全改变最初预计的执行过程,产生恶意效果. 下面是几种主要的注入式攻击途径 ...
- qemu-nbd方式挂载qcow2镜像
客户端配置 加载nbd模块 [root@centos sm]# rmmod nbd [root@centos sm]# modprobe nbd max_part=8 映射服务器的块设备到本地nbd设 ...
- PreparedStatement和Statement区别详解
技术原理 该 PreparedStatement接口继承Statement,并与之在两方面有所不同: PreparedStatement 实例包含已编译的 SQL 语句.这就是使语句“准备好”.包含于 ...
- JqGrid 隐藏水平滚动条完美解决方案
我有强迫症,网上找的几个看着就不舒服 不用更改样式表,隐藏最右侧的边框. .ui-jqgrid .ui-jqgrid-bdiv{ overflow-x: hidden; } 不用通过js控制加1px ...
- JavaScript 引用【转】
从一个例子说起: var m ={a:’a’, b:’b’}; var n=m; n.c=’c’; 那么在这个时候 , m.c 也会变成 ’c’! 这个问题在我最开始学习 JS 语言时个人一直处于概念 ...
- MR案例:倒排索引 && MultipleInputs
本案例采用 MultipleInputs类 实现多路径输入的倒排索引.解读:MR多路径输入 package test0820; import java.io.IOException; import j ...
- Jquery 复制功能
使用clipboardjs插件实现鼠标点击复制功能: 官网:https://clipboardjs.com/ 使用示例: 1.引入 <script type="text/javascr ...
- SpringMVC HttpMessageConverter 匹配规则
以下内容,如有问题,烦请指出,谢谢! SpringMVC启动时会自动配置一些HttpMessageConverter,接收到http请求时,从这些Converters中选择一个符合条件的来进行Http ...