牛客网NOIP赛前集训营 第6场 T1 最长路

【题解】
先建反向图,然后跑拓扑排序求出最长路。
将所有的点按照最长路从小到大分层,把上一层连向这一层的边按照边权为第一关键字、起点的排名为第二关键字排序。
按照这个顺序更新这一层的答案,按照这一层每个点被更新的顺序得到这一层的点的排名。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define rg register
#define N 1000010
#define Mod (998244353)
using namespace std;
int n,m,tot,cnt,last[N],in[N],dis[N],q[N],rk[N],ans[N];
struct edge{int to,pre,dis;}e[N];
struct poi{int dis,num;}p[N];
struct rec{int w,rk,from,to;}r[N];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
inline bool cmp(rec a,rec b){
if(a.w==b.w) return a.rk<b.rk;
return a.w<b.w;
}
inline bool cmp2(poi a,poi b){return a.dis<b.dis;}
inline void topu(int x){
int front=,rear=; q[]=x;
while(front<rear){
int now=q[++front];
for(rg int i=last[now],to;i;i=e[i].pre){
to=e[i].to;
dis[to]=max(dis[to],dis[now]+);
if(!(--in[to])) q[++rear]=to;
}
}
}
int main(){
n=read(); m=read();
for(rg int i=;i<=m;i++){
int u=read(),v=read(),d=read(); in[u]++;
e[++tot]=(edge){u,last[v],d}; last[v]=tot;
}
for(rg int i=;i<=n;i++)if(!in[i]&&!dis[i]) topu(i);
for(rg int i=;i<=n;i++){
p[i].num=i;
if(in[i]) p[i].dis=2e9; else p[i].dis=dis[i];
}
sort(p+,p++n,cmp2);
int st=,ed=;
while(st<=n){
tot=;
while(p[ed].dis==p[st].dis&&ed<=n){
int now=p[ed].num;
// printf("now=%d ed=%d\n",now,ed);
for(rg int i=last[now],to;i;i=e[i].pre){
if(dis[to=e[i].to]==dis[now]+) r[++tot]=(rec){e[i].dis,rk[now],now,to};
}
ed++;
}
sort(r+,r++tot,cmp);
for(rg int i=;i<=tot;i++)if(!ans[r[i].to]){
// printf("%d %d %d %d %d\n",r[i].to,r[i].from,r[i].w,ans[r[i].from],ans[r[i].to]);
ans[r[i].to]=(1ll*ans[r[i].from]*+r[i].w*)%Mod;
rk[r[i].to]=++cnt;
}
st=ed;
}
for(rg int i=;i<=n;i++) if(in[i]>) puts("Infinity"); else printf("%d\n",ans[i]%Mod);
return ;
}
牛客网NOIP赛前集训营 第6场 T1 最长路的更多相关文章
- 牛客网NOIP赛前集训营-提高组(第四场)游记
牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...
- 牛客网NOIP赛前集训营-提高组(第四场)B区间
牛客网NOIP赛前集训营-提高组(第四场)B区间 题目描述 给出一个序列$ a_1 \dots a_n$. 定义一个区间 \([l,r]\) 是好的,当且仅当这个区间中存在一个 \(i\),使得 ...
- 牛客网NOIP赛前集训营-提高组(第四场)B题 区间
牛客网NOIP赛前集训营-提高组(第四场) 题目描述 给出一个序列 a1, ..., an. 定义一个区间 [l,r] 是好的,当且仅当这个区间中存在一个 i,使得 ai 恰好等于 al, al+1, ...
- 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告
目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...
- 牛客网NOIP赛前集训营-提高组18/9/9 A-中位数
链接:https://www.nowcoder.com/acm/contest/172/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 牛客网NOIP赛前集训营-提高组(第二场)A 方差
链接:https://www.nowcoder.com/acm/contest/173/A来源:牛客网 题目描述 一个长度为 m 的序列 b[1...m] ,我们定义它的方差为 ,其中 表示序列的平 ...
- 牛客网NOIP赛前集训营-提高组(第八场)
染色 链接:https://ac.nowcoder.com/acm/contest/176/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10 ...
- 牛客网NOIP赛前集训营 提高组(第七场)
中国式家长 2 链接:https://www.nowcoder.com/acm/contest/179/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K, ...
- [牛客网NOIP赛前集训营-普及组(第二场)]D-合法括号序列
链接:https://www.nowcoder.com/acm/contest/165/D来源:牛客网 合法括号序列 键盘上有左括号(,右括号),和退格键-,共三个键. 牛牛希望按键n次,使得输入的字 ...
随机推荐
- ES高级查询
Query Content 在查询过程中,除了判断文档是否满足查询条件外,ES还会计算一个_score来标识匹配的程度,旨在判断目标文档和查询条件的匹配有多好 # POST 192.168.100.1 ...
- 贪心 Codeforces Round #109 (Div. 2) B. Combination
题目传送门 /* 贪心:按照能选的个数和点数降序排序,当条件不符合就break,水题啊! */ #include <cstdio> #include <algorithm> # ...
- magento 添加事件
首先是配置文件config.xml里的配置 <checkout_cart_save_after> /*事件名字*/ <observers> <deal> /*模块名 ...
- E. Dasha and Puzzle 数学题
http://codeforces.com/contest/761/problem/E 给出一颗树,要求在坐标系中用平行于坐标轴的线描绘出来. 要求边不能相交,而且点的坐标唯一. 注意到2^1 + 2 ...
- [转]Windows Azure安全概述
本文转自:http://blogs.msdn.com/b/azchina/archive/2011/03/06/windows_5f00_azure_5f00_security_5f00_overvi ...
- AJPFX理解反射及反射的应用
怎么理解反射,反射的应用 反射就是把Java类中的各种成分映射成相应的Java类. 一般情况下我们要解决某个问题,先找到相关的类,创建该类的对象,然后通过该对象调用对应的方 ...
- 学JAVA第二十二天,StringBuffer的好处
五一的假期今天就结束了,又要回来上课了. 今天就写一下StringBuffer的好处吧. StringBuffer类的对象能够被多次的修改,并且不产生新的未使用对象. 也就是说,我们平时用String ...
- Android习惯——给全部Activity添加集合管理
title: 2017-3-23 Android习惯--给全部Activity添加集合管理 public void ActivityCollector{ public static List<A ...
- php接收json格式数据(text/xml)
在API服务中,目前流行采用json形式来交互. 给前端调用的接口输出Json数据,这个比较简单,只需要组织好数据,用json_encode($array) 转化一下,前端就得到json格式的数据. ...
- 面向对象编程(OOP)基础知识(一)
Java是一个支持并发.基于类和面向对象的计算机编程语言. 下面列出了面向对象软件开发的优点: 1.代码开发模块化,更易维护和修改. 2.代码复用. 3.增强代码的可靠性和灵活性. 4.增加代码的可理 ...