小智的旅行(Bridge)51nod 提高组试题
题目描述
小智最喜欢旅行了,这次,小智来到了一个岛屿众多的地方,有N座岛屿,编号为0到N-1,岛屿之间 由一些桥连接,可以从桥的任意一端到另一端,由于岛屿可能比较大,所以会出现一些桥连接的是同 一个岛屿,岛屿之间也可能有多座桥连接,每条桥有一个长度,小智有一个习惯,每次走过的桥都必 须严格比之前走的桥长度长,小智可以从任意一个岛屿出发,任意一个岛屿结束,现在小智想知道最 多能走过多少条桥?
输入格式
第一行两个数N和M,分别表示岛屿个数和桥的个数 接下来M行,每行三个数a,b,c,表示岛屿a和b之间由一条长度为c的桥连接。
输出格式
一个数表示最多经过的桥的数量
咋一看,这道题好像有点迷。从普通的最小生成树、最短路、DFS等似乎无法下手。于是,考虑DP。
首先,设计状态: 设 dp[i] 表示第 i 个点最多的边。那么,如果我们能够走某一条边,即有:
dp[u] = max( dp[u], dp[v] + 1). dp[v] = max(dp[v], dp[u] + 1);
问题来了,如何确保我们的边可以走? 建图似乎很麻烦。
所以,我们直接排序!
将边按从小到大排序,那么就可以保证依次递增,我们就可以走了。
上代码:
#include <bits/stdc++.h>
using namespace std;
#define N 1000010
#define isdigit(c) ((c) >= '0' && (c) <= '9') 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;
}
inline int max(int a, int b){
return a > b ? a : b;
} struct node{
int u, v, w;
} t[N];
int dp[N], temp[N]; bool cmp(node a, node b){
return a.w < b.w;
} int main(){
int n = read(), m = read();
for(int i = ;i < m; i++)
t[i].u = read() + , t[i].v = read() + , t[i].w = read();
sort(t, t + m, cmp);
int last = -;
dp[] = ;
for(int i = ;i < m; i++){
if(t[i].w != t[i + ].w){
for(int j = last + ; j <= i; j++){
int u = t[j].u, v = t[j].v;
temp[u] = dp[u];
temp[v] = dp[v]; /*注意存临时变量,对应其原始dp值,因为后面u和v都要更改*/
}
for(int j = last + ;j <= i; j++){
int u = t[j].u, v = t[j].v;
dp[u] = max(dp[u], temp[v] + );
dp[v] = max(dp[v], temp[u] + );
}
last = i;
} }
int ans = -;
for(int i = ;i <= n; i++) ans = max(ans, dp[i]);
printf("%d\n", ans);
return ;
}
小智的旅行(Bridge)51nod 提高组试题的更多相关文章
- 小智的糖果(Candy) 51nod 提高组试题
luogu AC通道! (官方数据) 题目描述 小智家里来了很多的朋友,总共有N个人,站成一排,分别编号为0到N-1,小智要给他们分糖果.但 是有的朋友有一些特殊的要求,有的人要求他左右的两个人(左边 ...
- 战略威慑 51nod提高组试题
AC通道 题目背景 马奥雷利亚诺布恩迪亚上校发动了他的第三十二次战争,让我们祝他好运. 题目描述 马孔多附近有n个城市, 有n-1条双向道路连通这些城市.上校想通过摧毁两条公路的方式对当局予以威慑.但 ...
- 赛艇表演 51nod提高组模拟试题
AC通道 题目描述 小明去某个地区观看赛艇比赛,这个地区共有n个城市和m条道路,每个城市都有赛艇比赛,在第i个 城市观看赛艇表演的价钱为ai, 去其他城市观看也需要支付赛艇表演的价格.任意两个城市之间 ...
- noip2010初赛提高组 试题详解
转载自:https://blog.csdn.net/eirlys_north/article/details/52889970 一.单项选择题 1.与16进制数 A1.2等值的10进制数是 ( ) A ...
- noip2011初赛提高组 试题详解
转载自:https://blog.csdn.net/Eirlys_North/article/details/52889993 一.单项选择题(共20题,每题1.5分,共计30分,每题有且仅有一个正确 ...
- 9.2 NOIP提高组试题精解(2)
9-18 fruit.c #include <stdio.h> #define MAXN 10000 int Queue1[MAXN], Queue2[MAXN]; void Insert ...
- 9.2 NOIP提高组试题精解(1)
9-16 poise.c #include <stdio.h> #define MAXN 1001 int main() { ], flag[MAXN] = { }; //保存6种砝码的数 ...
- NOIp 2018 普及&提高组试题答案
你们考的咋样呢?在评论区说出自己的分数吧!
- 【08NOIP提高组】笨小猴
笨 小 猴 来自08年NOIP提高组的第一题 1.题目描述 [题目描述] 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头痛.经实验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体 ...
随机推荐
- python(简介)
python发展史: 自从20世纪90年代初Python语言诞生至今,它已被逐渐广泛应用于系统管理任务的处理和Web编程. Python的创始人为荷兰人吉多·范罗苏姆 [3] (Guido van ...
- django源码解读——runserver分析
开始之前建议先参考一下这篇文章:https://blog.csdn.net/qq_33339479/article/details/78862156class Command(BaseCommand) ...
- 内存迟迟下不去,可能你就差一个GC.Collect
一:背景 1. 讲故事 我们有一家top级的淘品牌店铺,为了后续的加速计算,在程序启动的时候灌入她家的核心数据到内存中,灌入完成后内存高达100G,虽然云上的机器内存有256G,然被这么划掉一半看着还 ...
- 基本Linux命令(上)
Linux的难点在于我们需要记忆大量的命令及参数.如有问题请批评指正,在下感激不尽. Linux的命令都是在shell下使用的,也就是我们常说的终端(Terminal).包 ...
- java基础篇 之 再探内部类跟final
之前写过一篇文章:从垃圾回收机制解析为什么局部内部类只能访问final修饰的局部变量以及为什么加final能解决问题,经过这两天的学习,发现有些不对,必须再来捋一捋 先看之前的例子: /** * @a ...
- NIO(一) Java NIO 概述
转:http://ifeve.com/overview/ Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和 ...
- python语法学习第十天--魔法方法
魔法方法二!!! 属性访问:在对属性任何操作时,都会调用 有关属性 __getattr__(self, name) 定义当用户试图获取一个不存在的属性时的行为 __getattribute__(s ...
- 内网穿透访问Vue项目的时候出现Invalid Host header解决办法
适用场景: 在本地的Vue-cli3项目, 需要其他人浏览. 如果没有外网的服务器, 可以把自己的电脑当做服务器. 这时候需要外网的人能访问到自己的电脑. Mac内网穿透工具:natapp Inval ...
- 散列表PTA判断
1-1 在散列表中,所谓同义词就是具有相同散列地址的两个元素. (1分) T F 作者 DS课程组 单位 浙江大学 1-2 采用平方探测冲突解决策略(hi(k)=(H(k)+ ...
- python --RecursionError: maximum recursion depth exceeded in comparison
在学习汉娜塔的时候,遇到一个error RecursionError: maximum recursion depth exceeded in comparison 经过百度,百度的方法: 加上: i ...