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 Page Object(PO)设计模式
Webdriver UI自动化测试火了好几年了,具体怎么设计自动化测试测试工程,组织测试用例完全凭借着自己的经验和习惯. 最近忽然听说了Page Object(简称PO)火了起来,也有面试的时候被问到 ...
- 斐迅面试记录—Http协议中的Header
HTTP Request的Header信息 1.HTTP请求方式 如下表: 说明: 主要使用到“GET”和“POST”. 实例: POST /test/tupian/cm HTTP/1.1 分成三部 ...
- [入坑系列] Mybatis 中$与#的区别
1.理解 1 #是将传入的值当做字符串的形式,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 sel ...
- 20145307JAVA学习期末总结
20145307<Java程序设计>课程总结 每周读书笔记链接汇总 20145307 <Java程序设计>第一周学习总结:http://www.cnblogs.com/Jcle ...
- Jquery13 Ajax 进阶
学习要点: 1.加载请求 2.错误处理 3.请求全局事件 4.JSON 和 JSONP 5.jqXHR 对象 一.加载请求 在 Ajax 异步发送请求时,遇到网速较慢的情况,就会出现请求时间较长的问题 ...
- Spring笔记(二)
1. SPRING aop入门 Aop 面向切面编程 在一个大型的系统中,会写很多的业务类--业务方法 同时,一个大型的系统中,还有很多公共的功能:比如事务管理.日志处理.缓存处理..... 1.1 ...
- office使用技巧
一.excel 1.在空格内换行:ALT+ENTER 2.打出勾:插入->符号
- Docker storage drivers
因为Docker的镜像是分层的,包含只读层和可读写层,因此选择正确的Storage Driver对于容器的性能是非常重要的. 支持的Linux发行版本 目前推荐使用性能最好的Overlay2.RHEL ...
- 配置Gitlab Push自动触发jenkins构建
一. 下载gitlab plugin Jenkins>插件管理 下载并安装gitlab plugin 二. 配置gitlab认证 路径Jenkins>Credentials>Syst ...
- Byte[]分配在哪里?
http://stackoverflow.com/questions/1113819/arrays-heap-and-stack-and-value-types Your array is alloc ...