AC通道

题目背景

马奥雷利亚诺布恩迪亚上校发动了他的第三十二次战争,让我们祝他好运。

题目描述

马孔多附近有n个城市, 有n-1条双向道路连通这些城市。上校想通过摧毁两条公路的方式对当局予以威慑。但是上校的老师 告诉他为了战略目的这两条路不可以有共同的城市。这次行动对当局的威慑效果将等于两条路径的长 度的乘积。假设每条道路的长度等于1,并且路径的长度等于道路的数量。请你帮上校造成最大的威 慑。

输入格式

单组测试数据。第一行是一个整数 n (2≤n≤200) ,n是这个马孔多附近城市的数量。接下来n-1行是 道路的信息,每一行是两个整数ai,bi,它们是城市的编号,表示ai和bi之间有一条道路直接连通。 (1≤ai,bi≤n)

输出格式

输出最大的威慑

输入输出样例

输入输出样例

输入 #1复制

4
1 2
2 3
3 4
输出 #1复制

1
输入 #2复制

2
2 1
输出 #2复制

0
输入 #3复制

6
1 2
2 3
2 4
5 4
6 4
输出 #3复制

4

说明/提示

对于35%的数据, n <= 10 对于75%的数据, n <= 100 对于100%的数据, n <= 200

思路十分简单,直接枚举每条边,将其删掉,形成两棵树,以两边的定点为起点分别找树的直径。

???

So,why is this right?

如此考虑:

题目中要求我们路径上不能有交叉,同时长度要尽量大。

对于条件2,很容易想到求树的直径。对于条件1,可以如此模拟:

要使得路径尽量长,就要走过尽可能多的边。那么,最好的方法是什么?

让两条道路相差的尽可能不远。既然如此,那么最不远的两个点是什么点?

一条边的两个端点。于是,断开这条边防止交叉,然后求分别跑树的直径即可。

AC利器:

#include<bits/stdc++.h>
using namespace std;
#define N 1010
#define ll long long /*断开一条边后分成两棵树,求两棵树的直径 */ inline int read(){
int x = , s = ;
char c = getchar();
while(!isdigit(c)){
if(c == '-') s = -;
c = getchar();
}
while(isdigit(c)){
x = (x << ) + (x << ) + (c ^ '');
c = getchar();
}
return x * s;
} struct node{
int u, v;
int next;
}t[N];
int f[N];
bool vis[N];
int dp[N];
int ans = , temp = , temp1 = ; int bian = ;
inline void add(int u, int v){
t[++bian].u = u;
t[bian].v = v;
t[bian].next = f[u];
f[u] = bian;
return ;
} void dfs(int now){
for(int i = f[now]; i;i = t[i].next){
int v = t[i].v, u = t[i].u;
if(!vis[v]){
vis[v] = ;
dfs(v);
temp = max(temp, dp[u] + dp[v] + );
dp[u] = max(dp[u], dp[v] + );
}
}
return ;
} int main(){
// freopen("terrorize.in","r",stdin);
// freopen("terrorize.out","w",stdout);
int n = read();
for(int i = ;i <= n - ;i ++){
int x = read(), y = read();
add(x, y);
add(y, x);
}
for(int i= ;i <= bian;i += ){
memset(vis, , sizeof(vis));
memset(dp, , sizeof(dp));
int v = t[i].v, v2 = t[i+].v;
vis[v] = vis[v2] = ;
temp1 = temp = ;
dfs(v);
temp1 = temp;
temp = ;
dfs(v2);
ans = max(ans, temp * temp1);
}
cout << ans << endl;
return ;
}

战略威慑 51nod提高组试题的更多相关文章

  1. 小智的糖果(Candy) 51nod 提高组试题

    luogu AC通道! (官方数据) 题目描述 小智家里来了很多的朋友,总共有N个人,站成一排,分别编号为0到N-1,小智要给他们分糖果.但 是有的朋友有一些特殊的要求,有的人要求他左右的两个人(左边 ...

  2. 小智的旅行(Bridge)51nod 提高组试题

    luogu AC传送门(官方数据) 题目描述 小智最喜欢旅行了,这次,小智来到了一个岛屿众多的地方,有N座岛屿,编号为0到N-1,岛屿之间 由一些桥连接,可以从桥的任意一端到另一端,由于岛屿可能比较大 ...

  3. 赛艇表演 51nod提高组模拟试题

    AC通道 题目描述 小明去某个地区观看赛艇比赛,这个地区共有n个城市和m条道路,每个城市都有赛艇比赛,在第i个 城市观看赛艇表演的价钱为ai, 去其他城市观看也需要支付赛艇表演的价格.任意两个城市之间 ...

  4. noip2010初赛提高组 试题详解

    转载自:https://blog.csdn.net/eirlys_north/article/details/52889970 一.单项选择题 1.与16进制数 A1.2等值的10进制数是 ( ) A ...

  5. noip2011初赛提高组 试题详解

    转载自:https://blog.csdn.net/Eirlys_North/article/details/52889993 一.单项选择题(共20题,每题1.5分,共计30分,每题有且仅有一个正确 ...

  6. 9.2 NOIP提高组试题精解(2)

    9-18 fruit.c #include <stdio.h> #define MAXN 10000 int Queue1[MAXN], Queue2[MAXN]; void Insert ...

  7. 9.2 NOIP提高组试题精解(1)

    9-16 poise.c #include <stdio.h> #define MAXN 1001 int main() { ], flag[MAXN] = { }; //保存6种砝码的数 ...

  8. NOIp 2018 普及&提高组试题答案

    你们考的咋样呢?在评论区说出自己的分数吧!

  9. 【NOIP2013提高组T3】加分二叉树

    题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...

随机推荐

  1. 《C程序设计语言》 练习1-22

    问题描述 练习1-22 编写一个程序,把较长的输入行“折”成短一些的两行或者多行,折行的位置在输入行的第N列之前的最后一个非空格之后.要保持程序能够智能地处理输入行很长以及在制定的列前没有空格或者制表 ...

  2. Java.lang.String类

    1.String类定义   String 字符串对象本质上是一个 final 修饰的字符串数组对象, java字符串就是Unicode字符序列. 因为被final修饰, 所以字符串是常量,它们的值一旦 ...

  3. 跟哥一起学Python(1) - python简介

    01—写在前面 我做了十几年的程序猿,码过代码.带过项目.做过产品经理.做过软件架构师.因为我是做通信设备软件的,面向底层操作系统,所以我的工作主要以C语言为主.Python在我的工作中通常用来写一些 ...

  4. Fibonacci相关问题

    公式如下: 递归的解法我就不写了,贴一个递推的. long long Fibonacci(unsigned int n) { ) ; ) ; ; ; long long res; ; i <= ...

  5. mac下xampp访问php显示403错误

    错误描述 New xampp security concept: Access Forbidden Error 403 错误分析和解决 403就是我们访问的时候,被安全策略拒绝了,解决方法 找到文件 ...

  6. 【Spark】RDD(Resilient Distributed Dataset)究竟是什么?

    目录 基本概念 官方文档 概述 含义 RDD出现的原因 五大属性 以单词统计为例,一张图熟悉RDD当中的五大属性 解构图 RDD弹性 RDD特点 分区 只读 依赖 缓存 checkpoint 基本概念 ...

  7. react中dangerouslySetInnerHTML使用

    在react中,通过富文本编辑器进行操作后的内容,会保留原有的标签样式,并不能正确展示. 在显示时,将内容写入__html对象中即可.具体如下: <div dangerouslySetInner ...

  8. apply call bind的用法与实现

    概念 apply call 和bind 允许为不同的对象分配和调用属于一个对象的函数/方法.同时它们可以改变函数内 this 的指向. 区别 apply 和 call 接收的参数形式不同 apply ...

  9. [hdu]5202

    思路:把所有'?'用'a'代替,如果冲突则最后一个改为'b',注意特判最后一个问号在中间的情况.

  10. Mysql 常用函数(19)- mod 函数

    Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html mod 的作用 求余数,和%一样 mod的语法格式 ...