小智的旅行(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.题目描述 [题目描述] 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头痛.经实验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体 ...
随机推荐
- 一个epoll的简单例子
epoll事件机制的触发方式有两种:LT(电平触发)和ET(边沿触发) EPOLLIN事件: 内核中的socket接收缓冲区 为空(低电平) 内核中的socket接受缓冲区 不为空(高电平) EPOL ...
- Jetson AGX Xavier/Ubuntu更改pip3源
pip3换源: 修改~/.pip/pip.conf,如果没有这个文件,就创建一个. 内容如下: [global]index-url = https://pypi.tuna.tsinghua.edu.c ...
- (一)Redis介绍
1 背景 在早期的互联网Web 1.0时代,大部分企业还是采用传统的企业级单体应用架构,而一时间蜂拥而至的巨大用户流量使得这种架构难以支撑,通过对诸多系统架构实施以及对巨大用户流量的分析过程中发现,其 ...
- 002_python的in,while else,格式化输出,逻辑运算符,int与bool转换,编码
数据 1.什么是数据? x=10,10是我们要存储的数据 2.为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3.数据类型 数字 字符串 列表 元组 字典 集合 ...
- 玩好百家乐需要掌握些什么技巧和打法?来自ag老玩家的实战经验心得总结
最近很多网友给我留言,说为什么学了很多技巧和打法这个游戏还是玩不好,坦白说,其实bjl想要玩得好,不是说你懂得多少技巧和掌握了多少种打法就可以的了,而是你要懂得如何把这些正确结合去运用,这些我之前都强 ...
- PHP导出excel文件之权限字段筛选导出
因为导出excel时要过滤掉不是自身权限内的数据,权限有专门的字段,所以导出的数据要具体考量,数据库权限字段是MMId,因为登录的时候MMId已存入SESSION,所以导出的时候只要判断是否在此SES ...
- 生产者消费者问题中的同步机制JAVA设计和实现
目录 问题描述 问题分析 利用记录型信号量解决 运行环境 实现思路 代码实现 运行截图 过程中出现的问题和注意点 利用AND信号集解决 运行环境 实现思路 代码实现 运行截图 问题描述 若干进程通过有 ...
- [hdu5249]动态中位数
题意:3种操作分别为入队,出队,查询当前队列的中位数.操作数为1e5数量级. 思路:先考虑离线算法,可以离散+线段树,可以划分树,考虑在线算法,则有treap名次树,SBtree(size balan ...
- Python--oop面向对象的学习1
类和对象的成员分析 ·类和对象都可以存储成员,成员可以归类为所有,也可以归对象所有 ·类存储成员时使用的是与类关联的一个对象 ·独享存储成员时存储在当前对象中 ·对象访问一个成员,如果对象中没有该成员 ...
- urldecode二次编码
0x01 <?php if(eregi("hackerDJ",$_GET[id])) { echo("not allowed!"); exit(); } ...