USACO18DEC Fine Dining G

这篇具有很好参考价值的文章主要介绍了USACO18DEC Fine Dining G。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

P5122 [USACO18DEC] Fine Dining G

题目大意

有一个由 n n n个点 m m m条边构成的无向连通图,这 n n n个点的编号为 1 1 1 n n n。前 n − 1 n-1 n1个点上都有一头奶牛,这些奶牛都要前往 n n n号点。第 i i i条边连接 a i a_i ai b i b_i bi,经过需要时间 t i t_i ti

k k k个干草捆分布在这些点中,第 i i i个干草捆的美味值为 y i y_i yi。每头奶牛都希望能够在某一处干草捆处停留并吃草,但奶牛只会在经过这个干草捆使她回牛棚的时间增加不超过这个干草捆的美味值时这样做。一头奶牛只会在一处干草捆处停留并吃草。

输出有 n − 1 n-1 n1行。如果第 i i i个点的奶牛可以在回牛棚的路上会前往某一个干草捆并且在此进食,则第 i i i行输出 1 1 1;否则,输出 0 0 0

可能有多个干草捆在同一个点。

2 ≤ n ≤ 5 × 1 0 4 , 1 ≤ m ≤ 1 0 5 2\leq n\leq5\times 10^4,1\leq m\leq 10^5 2n5×104,1m105


题解

dijkstra \text{dijkstra} dijkstra算出第 n n n个点到各个点的距离,设到第 i i i个点的距离为 d i s i dis_i disi

将所有有干草捆的点 x x x作为第二次 dijkstra \text{dijkstra} dijkstra的起点,起始值设为 d i s x − y x dis_x-y_x disxyx,意为从点 x x x到点 n n n的距离减去这个干草捆的美味值。用这些点为起点做一次 dijkstra \text{dijkstra} dijkstra,到各个点的距离记为 t d i td_i tdi

最后,对于每个 1 ≤ i < n 1\leq i<n 1i<n,如果 t d i ≤ d i s i td_i\leq dis_i tdidisi,则可以在一个干草捆停留,否则不行。

时间复杂度为 O ( ( n + m ) log ⁡ n ) O((n+m)\log n) O((n+m)logn)文章来源地址https://www.toymoban.com/news/detail-665709.html

code

#include<bits/stdc++.h>
using namespace std;
int n,m,k,x,y,z,tot=0,d[200005],l[200005],r[200005],w[200005];
int vs[100005],dis[100005],td[100005];
struct node{
	int id,x;
	bool operator<(const node ax)const{
		return x>ax.x;
	}
};
priority_queue<node>q;
void add(int xx,int yy,int zz){
	l[++tot]=r[xx];d[tot]=yy;r[xx]=tot;w[tot]=zz;
}
void dd1(){
	for(int i=1;i<=n;i++){
		vs[i]=0;dis[i]=2e9;
	}
	dis[n]=0;
	q.push((node){n,0});
	while(!q.empty()){
		int u=q.top().id;q.pop();
		if(vs[u]) continue;
		vs[u]=1;
		for(int i=r[u];i;i=l[i]){
			if(dis[d[i]]>dis[u]+w[i]){
				dis[d[i]]=dis[u]+w[i];
				q.push((node){d[i],dis[d[i]]});
			}
		}
	}
}
void dd2(){
	for(int i=1;i<=n;i++){
		vs[i]=0;
		if(td[i]<2e9) q.push((node){i,td[i]});
	}
	while(!q.empty()){
		int u=q.top().id;q.pop();
		if(vs[u]) continue;
		vs[u]=1;
		for(int i=r[u];i;i=l[i]){
			if(td[d[i]]>td[u]+w[i]){
				td[d[i]]=td[u]+w[i];
				q.push((node){d[i],td[d[i]]});
			}
		}
	}
}
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);add(y,x,z);
	}
	dd1();
	for(int i=1;i<=n;i++) td[i]=2e9;
	for(int i=1;i<=k;i++){
		scanf("%d%d",&x,&z);
		td[x]=min(td[x],dis[x]-z);
	}
	dd2();
	for(int i=1;i<n;i++){
		if(td[i]<=dis[i]) printf("1\n");
		else printf("0\n");
	}
	return 0;
}

到了这里,关于USACO18DEC Fine Dining G的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [USACO07DEC] Sightseeing Cows G(分数规划+负权回路判定)

    [USACO07DEC] Sightseeing Cows G - 洛谷 题目大意: 给出一张n点m边的带点权带边权的有向图 求一个回路使得路上点权和除以边权和最大(最优比率回路) 首先一定仔细读题,是回路不是路径 由于回路上所有点权只能获取一次,但边权会获取很多次,所以最优解一定是简单回路(无

    2024年02月10日
    浏览(248)
  • P2921 [USACO08DEC] Trick or Treat on the Farm G

    Portal. 每只奶牛的终止条件是到达自己已经访问过的点,换言之,就是该奶牛的路线构成了一个环。并且,每一个房间通往的房间都是固定且唯一的,所以说只要进入的这个房间在环上,这个房间之后会获得的糖果数已经固定了。 我们开一个数组 s 记录当前位置的糖果数量,

    2024年02月06日
    浏览(235)
  • [USACO23JAN] Lights Off G题解

    洛谷[USACO23JAN] Lights Off G 题目大意 贝西想要睡觉,但是农场的灯一直开着,影响它睡觉。 贝西有两个长度为 n n n 的 01 01 01 字符串,分别表示 n n n 盏灯的序列和开关的序列。其中,表示灯的序列, 0 0 0 表示关灯, 1 1 1 表示开灯;表示开关的序列, 1 1 1 表示可操控的, 0 0

    2024年02月13日
    浏览(33)
  • P2730 [USACO3.2] 魔板 Magic Squares 题解

    夜深人静的夜晚,我开了这道题。看起来,完成它是一件轻而易举的事。我想了想,打开Dev-C++,开始写代码。 然而,那时的我还不知道,我踏入了深渊...... 咳咳,中二病犯了,前面的文字请忽略。 题目要求最少操作次数,显然,我们要使用BFS来求解。 对于每个节点,接下

    2024年02月13日
    浏览(30)
  • 【题解】JZOJ6578 / 洛谷P5201[USACO2019Jan]Shortcut G

    洛谷 P5201 [USACO19JAN] Shortcut G 在一个带权无向连通图上,每个点有 a i a_i a i ​ 只奶牛,奶牛会走最短路径到 1 1 1 ,如果有多条路径,选择字典序最小的,定义移动总时间为所有奶牛走到 1 1 1 的时间之和。你可以修建一条从任意一点到 1 1 1 的边权为 t t t 的边,奶牛只有在平时

    2024年02月11日
    浏览(30)
  • [USACO11MAR] Brownie Slicing G题解(二分+二维前缀和+矩阵分割)

    题目地址 P3017 [USACO11MAR] Brownie Slicing G 二分最大化最小值 切割思路: 一行一行进行切割,如果这一行可以切割出b块大于等于mid的块,就开始切割下一行 如果无法切割出b块,就把正在切割的行与下一行拼起来一起切割 最后通过能切割出b块的水平块块够不够a条来判断m是否合

    2024年02月07日
    浏览(38)
  • Ctfshow web入门 命令执行RCE篇 web29-web77 与 web118-web124 详细题解 持续更新中(预计8.18完成)~

    pregmatch 是正则匹配函数,匹配是否包含flag, if(!preg_match(\\\"/flag/i\\\", $c)) , /i 忽略大小写 可以利用system来间接执行系统命令 flag采用 f* 绕过,或者 mv fl?g.php 1.txt 修改文件名,或者 cat 反引号ls反引号 linux通配符:https://www.cnblogs.com/ysuwangqiang/p/11364173.html 多了对system和php的过滤 用

    2024年02月12日
    浏览(45)
  • openssl3.2 - 官方demo学习 - cms - cms_dec.c

    对用证书加密的CMS数据进行解密(也需要加密时用的那个证书)

    2024年01月20日
    浏览(37)
  • ArmSoM-RK3588编解码之mpp解码demo解析:mpi_dec_test

    [RK3588从入门到精通] 专栏总目录 mpi_dec_test 是rockchip官方解码 demo 本篇文章进行mpi_dec_test 的代码解析,解码流程解析 硬件环境: ArmSoM-W3 RK3588开发板 软件版本: OS:ArmSoM-W3 Debian11 mpp_create :获取 MppCtx 实例以及 MppApi 结构体 mpp_init: 初始化MppCtx 的编解码类型与格式 mpi-control:

    2024年02月04日
    浏览(49)
  • [Usaco2009 Oct]Heat Wave 热浪

    题目描述 有一个 n个点 m 条边的无向图,请求出从 s 到 t 的最短路长度。 输入格式第一行四个正整数 n, m, s, t。 接下来 m 行,每行三个正整数 u, v, w,表示一条连接 u, v 长为 w 的边。 1≤n≤2500,1≤m≤6200,1≤w≤1000。 输出格式 输出一行一个整数,表示答案。 样例输入 样例

    2024年02月14日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包