FZSZ Online Judge #858. 【四校联考1008】骑行川藏

问题描述

小C非常热衷于挑战自我,国庆假期他准备骑着自行车从福州前往成都再沿川藏线前往拉萨。川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而小C的体力十分有限,因此在每天的骑行前设定好目的地、同时合理分配好自己的体力是一件非常重要的事情。

可供小C选择的道路构成了一张连通无向图,小C的起点位于1号点,终点位于n号点,每条道路有一个困难度vi,小C定义一条路径的疲劳度为他路上经过的所有道路的困难度的最大值。一开始小C有k点体力,在通过一条道路时,他可以选择消耗若干点体力值,每消耗一点,道路的困难度也会降低1,但一条道路的困难度不能低于0。小C想知道他这次旅程的最小疲劳度。

输入格式

第一行三个非负整数n,m,k,分别表示图的点数,边数以及小C的初始体力值。

接下来m行,每行三个正整数xi,yi,vi,分别表示第i条边的两个端点以及困难度。

输出格式

输出一个整数,表示答案。

样例输入

3 3 1
1 2 3
2 3 4
1 3 5

样例输出

3

数据范围

对于20%的数据,n,m,k,vi<=1000;

对于另外20%的数据,m=n-1;

对于另外20%的数据,k=0;

对于100%的数据,2<=n<=50000,m,k,vi<=50000。

题目链接:http://192.168.68.33/problem/858.

类似问题:luoguP1948 [USACO08JAN]电话线Telephone Lines.

题目链接:https://www.luogu.org/problem/show?pid=1948.

解题报告

这题很显然是道二分题.

首先,先二分一个答案[0,max{vi}],复杂度(logmax{vi})

在对原图的边权进行改造:

(1).对于vi<=mid,建边权为0的新边,

(2).对于vi>mid,建边权为(vi-mid)的新边.

在新图中跑一遍最短路SPFA或堆优化的Dijkstra,

复杂度为O(km)或O(nlogm),

个人推荐堆优化的Dijkstra,复杂度稳定.

这样做可以找到一条最大值为mid且消耗体力最小的最优路径.

若dis[n]<=k,则mid为可行答案,继续二分[l,mid),

反之,mid不可行,继续二分(mid,r].

总复杂度为O(logmax{vi}*km)或O(logmax{vi}*nlogm).

AC代码

#include<cstdio>
#include<iostream>
#include<queue>
#define pa pair<int,int>
#define mp(x,y) make_pair(x,y)
#define FOR(i,s,t) for(register int i=s;i<=t;++i)
#define ll long long
#define INF 2147483647
#define BIG 200011
using namespace std;
priority_queue<pa>heap;
int n,m,k;
int x,y,z,tot,l,r,ans=50000;
int nxt[BIG],to[BIG],las[BIG],w[BIG],dis[BIG],vis[BIG];
inline void add(int x,int y,int z){
	nxt[++tot]=las[x];
	las[x]=tot;
	to[tot]=y;
	w[tot]=z;
	return;
}
inline int DJ(int x){
	FOR(i,2,n)
		dis[i]=INF,vis[i]=0;
	vis[1]=0;
	heap.push(mp(0,1));
	int now,u;
	while(!heap.empty()){
		now=heap.top().second;
		heap.pop();
		if(vis[now])
			continue;
		vis[now]=1;
		for(register int e=las[now];e;e=nxt[e]){
			u=w[e]<x?0:(w[e]-x);
			if(dis[to[e]]>dis[now]+u){
				dis[to[e]]=dis[now]+u;
				heap.push(mp(-dis[to[e]],to[e]));
			}
		}
	}
	return dis[n]<=k?1:0;
}
inline void divide(int l,int r){
	if(r-l<=3){
		FOR(i,l,r)
			if(DJ(i))
				ans=min(ans,i);
		return;
	}
	int mid=(l+r)>>1;
	if(DJ(mid)){
		ans=min(ans,mid);
		divide(l,mid-1);
	}
	else
		divide(mid+1,r);
	return;
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	FOR(i,1,m){
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
		ans=max(z,ans);
	}
	r=ans;
	divide(l,r);
	cout<<ans<<endl;
	return 0;
}

 

对于类似问题,做法类似.

二分答案,

改造边权:

(1).vi<=mid,新边权为0.

(2).vi>mid,新边权为1.

跑一边最短路,

复杂度为O(logmax{vi}*km)或O(logmax{vi}*nlogm).

AC代码自己xjbYY一下能写出来了.

  

 

转载于:https://www.cnblogs.com/Stump/p/7679812.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值