[USACO20FEB] Timeline G
题目描述
Bessie 在过去的 MMM 天内参加了 NNN 次挤奶。但她已经忘了她每次挤奶是在哪个时候了。
对于第 iii 次挤奶,Bessie 记得它不早于第 SiS_iSi 天进行。另外,她还有 CCC 条记忆,每条记忆形如一个三元组 (a,b,x)(a,b,x)(a,b,x),含义是第 bbb 次挤奶在第 aaa 次挤奶结束至少 xxx 天后进行。
现在请你帮 Bessie 算出在满足所有条件的前提下,每次挤奶的最早日期。
保证 Bessie 的记忆没有错误,这意味着一定存在一种合法的方案,使得:
- 第 iii 次挤奶不早于第 SiS_iSi 天进行,且不晚于第 MMM 天进行;
- 所有的记忆都得到满足;
输入格式
第一行三个整数 N,M,CN,M,CN,M,C。保证 1≤N,C≤1051 \leq N,C \leq 10^51≤N,C≤105,2≤M≤1092 \leq M \leq 10^92≤M≤109。
接下来一行包含 NNN 个整数 S1,S2,…,SnS_1, S_2 , \ldots, S_nS1,S2,…,Sn,保证 ∀1≤i≤n\forall 1 \leq i \leq n∀1≤i≤n,都满足 1≤Si≤M1 \leq S_i \leq M1≤Si≤M。
下面 CCC 行每行三个整数 a,b,xa,b,xa,b,x,描述一条记忆。保证 a≠ba \neq ba=b,且 1≤x≤M1 \leq x \leq M1≤x≤M。
输出格式
输出 NNN 行,每行一个整数,第 iii 行的数表示第 iii 次挤奶的最早日期。
样例 #1
样例输入 #1
4 10 3
1 2 3 4
1 2 5
2 4 2
3 4 4
样例输出 #1
1
6
3
8
提示
- 测试点 2∼42 \sim 42∼4 满足 N,C≤103N,C \leq 10^3N,C≤103。
- 测试点 5∼105 \sim 105∼10 没有特殊限制。
#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;
}
221



被折叠的 条评论
为什么被折叠?



