洛谷 P6145 [USACO20FEB] Timeline G

[USACO20FEB] Timeline G

题目描述

Bessie 在过去的 M M M 天内参加了 N N N 次挤奶。但她已经忘了她每次挤奶是在哪个时候了。

对于第 i i i 次挤奶,Bessie 记得它不早于第 S i S_i Si 天进行。另外,她还有 C C C 条记忆,每条记忆形如一个三元组 ( a , b , x ) (a,b,x) (a,b,x),含义是第 b b b 次挤奶在第 a a a 次挤奶结束至少 x x x 天后进行。

现在请你帮 Bessie 算出在满足所有条件的前提下,每次挤奶的最早日期。

保证 Bessie 的记忆没有错误,这意味着一定存在一种合法的方案,使得:

  • i i i 次挤奶不早于第 S i S_i Si 天进行,且不晚于第 M M M 天进行;
  • 所有的记忆都得到满足;

输入格式

第一行三个整数 N , M , C N,M,C N,M,C。保证 1 ≤ N , C ≤ 1 0 5 1 \leq N,C \leq 10^5 1N,C105 2 ≤ M ≤ 1 0 9 2 \leq M \leq 10^9 2M109

接下来一行包含 N N N 个整数 S 1 , S 2 , … , S n S_1, S_2 , \ldots, S_n S1,S2,,Sn,保证 ∀ 1 ≤ i ≤ n \forall 1 \leq i \leq n ∀1in,都满足 1 ≤ S i ≤ M 1 \leq S_i \leq M 1SiM

下面 C C C 行每行三个整数 a , b , x a,b,x a,b,x,描述一条记忆。保证 a ≠ b a \neq b a=b,且 1 ≤ x ≤ M 1 \leq x \leq M 1xM

输出格式

输出 N N N 行,每行一个整数,第 i i i 行的数表示第 i i i 次挤奶的最早日期。

样例 #1

样例输入 #1

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

样例输出 #1

1
6
3
8

提示

  • 测试点 2 ∼ 4 2 \sim 4 24 满足 N , C ≤ 1 0 3 N,C \leq 10^3 N,C103
  • 测试点 5 ∼ 10 5 \sim 10 510 没有特殊限制。
#include<bits/stdc++.h>
using namespace std;
struct aty {
	int v,w;
};
vector<aty> E[100010];
queue<int> q;
int n,m,dis[100010],u,v,w,fw[100010],op,c,s[100010];
bool vis[100010];
int main() {
	scanf("%d%d%d",&n,&m,&c);
	for(int i=1; i<=n; i++) {
		scanf("%d",&s[i]);
		E[0].push_back({i,s[i]});
	}
	for(int i=1; i<=c; i++) {
		scanf("%d%d%d",&u,&v,&w);
		E[u].push_back({v,w});
	}
	for(int i=1; i<=n; i++) {
		dis[i]=-INT_MAX;
	}
	dis[0]=0;
//	fw[0]=1;
	q.push(0);
	while(!q.empty()) {
		int u=q.front();
		q.pop();
		vis[u]=false;
		for(int i=0; i<E[u].size(); i++) {
			if(dis[u]+E[u][i].w>dis[E[u][i].v]) {
				dis[E[u][i].v]=dis[u]+E[u][i].w;
			/*	fw[E[u][i].v]++;
				if(fw[E[u][i].v]>n+1) {
					printf("No");
					return 0;
				}*/
				q.push(E[u][i].v);
				vis[E[u][i].v]=1;
			}
		}
	}
	for(int i=1;i<=n;i++){
		printf("%d\n",dis[i]); 
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值