牛客网NOIP赛前集训营 第6场 T1 最长路
【题解】
先建反向图,然后跑拓扑排序求出最长路。
将所有的点按照最长路从小到大分层,把上一层连向这一层的边按照边权为第一关键字、起点的排名为第二关键字排序。
按照这个顺序更新这一层的答案,按照这一层每个点被更新的顺序得到这一层的点的排名。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL long long 5 #define rg register 6 #define N 1000010 7 #define Mod (998244353) 8 using namespace std; 9 int n,m,tot,cnt,last[N],in[N],dis[N],q[N],rk[N],ans[N]; 10 struct edge{int to,pre,dis;}e[N]; 11 struct poi{int dis,num;}p[N]; 12 struct rec{int w,rk,from,to;}r[N]; 13 inline int read(){ 14 int k=0,f=1; char c=getchar(); 15 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 16 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 17 return k*f; 18 } 19 inline bool cmp(rec a,rec b){ 20 if(a.w==b.w) return a.rk<b.rk; 21 return a.w<b.w; 22 } 23 inline bool cmp2(poi a,poi b){return a.dis<b.dis;} 24 inline void topu(int x){ 25 int front=0,rear=1; q[1]=x; 26 while(front<rear){ 27 int now=q[++front]; 28 for(rg int i=last[now],to;i;i=e[i].pre){ 29 to=e[i].to; 30 dis[to]=max(dis[to],dis[now]+1); 31 if(!(--in[to])) q[++rear]=to; 32 } 33 } 34 } 35 int main(){ 36 n=read(); m=read(); 37 for(rg int i=1;i<=m;i++){ 38 int u=read(),v=read(),d=read(); in[u]++; 39 e[++tot]=(edge){u,last[v],d}; last[v]=tot; 40 } 41 for(rg int i=1;i<=n;i++)if(!in[i]&&!dis[i]) topu(i); 42 for(rg int i=1;i<=n;i++){ 43 p[i].num=i; 44 if(in[i]) p[i].dis=2e9; else p[i].dis=dis[i]; 45 } 46 sort(p+1,p+1+n,cmp2); 47 int st=1,ed=1; 48 while(st<=n){ 49 tot=0; 50 while(p[ed].dis==p[st].dis&&ed<=n){ 51 int now=p[ed].num; 52 // printf("now=%d ed=%d\n",now,ed); 53 for(rg int i=last[now],to;i;i=e[i].pre){ 54 if(dis[to=e[i].to]==dis[now]+1) r[++tot]=(rec){e[i].dis,rk[now],now,to}; 55 } 56 ed++; 57 } 58 sort(r+1,r+1+tot,cmp); 59 for(rg int i=1;i<=tot;i++)if(!ans[r[i].to]){ 60 // printf("%d %d %d %d %d\n",r[i].to,r[i].from,r[i].w,ans[r[i].from],ans[r[i].to]); 61 ans[r[i].to]=(1ll*ans[r[i].from]*29+r[i].w*29)%Mod; 62 rk[r[i].to]=++cnt; 63 } 64 st=ed; 65 } 66 for(rg int i=1;i<=n;i++) if(in[i]>0) puts("Infinity"); else printf("%d\n",ans[i]%Mod); 67 return 0; 68 }
转载于:https://www.cnblogs.com/DriverLao/p/9835289.html
牛客网NOIP赛前集训营 第6场 T1 最长路相关推荐
- 牛客网NOIP赛前集训营 提高组(第七场)
中国式家长 2 链接:https://www.nowcoder.com/acm/contest/179/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K ...
- 牛客网NOIP赛前集训营-普及组(第一场)
前三题略 T4: 题目描述 小A有n个长度都是L的字符串.这些字符串只包含前8个小写字符,'a'~'h'.但这些字符串非常的混乱,它们几乎长得互不相同.小A想通过一些规则,让它们长得尽可能相同.小A现 ...
- 牛客网NOIP赛前集训营-提高组(第六场)B-选择题
题目描述 有一道选择题,有 a,b,c,d 四个选项. 现在有 n 个人来做这题,第 i 个人有 pi,j 的概率选第 j 个选项. 定义\(cnt(x)\)为选第$ x $个选项的人数. 令\(mx ...
- 牛客网NOIP赛前集训营-提高组(第六场)B-选择题[背包]
题意 题目链接 分析 直接背包之后可以 \(O(n)\) 去除一个物品的影响. 注意特判 \([p==1]\) 的情况. 总时间复杂度为 \(O(n^2)\) . 代码 #include<bit ...
- 牛客网NOIP赛前集训营 提高组 第5场 T2 旅游
[题解] 我们可以发现不在最小生成树上的边一定不能多次经过,因为一条不在最小生成树上的边(u,v)的边权比最小生成树上(u,v)之间的路径更长,选择不在最小生成树上的边一定不划算. 我们还需要确定最小 ...
- [NowCoder]牛客网NOIP赛前集训营-提高组(第六场)题解
A.最长路 题意:给定有向图,每条边有个字符\([0,10^9]\),求每个点最长路字典序最小的方案.\(N,M\le 10^6\) 建反图跑拓扑排序,显然入过队的点都有最长路,考虑如何判断字典序大小 ...
- 牛客网NOIP赛前集训营-提高组(第七场)C 洞穴
洞穴 思路: 矩阵乘法 由于只需要知道 A ^ l 的 第a行第b个元素 所以我们每次在做矩阵乘法时只需要算第a行就可以了 还要像矩阵快速幂一样预处理A ^ (1<<d) 代码: #pra ...
- 牛客网NOIP赛前集训营-提高组(第七场)C-洞穴
题目描述 有一天,牛牛找到了一个巨大的洞穴.洞穴可以描述成一个有向图,一共有\(N\)个节点(从\(1\)到\(N\)编号)和\(M\)条长度为\(1\)的有向边,每条边从某一个节点\(u\)连向另一 ...
- 【题解】[牛客网NOIP赛前集训营-提高组(第七场)]C.洞穴 倍增优化DP+bitset
题目链接 #include<cstdio> #include<bitset> using namespace std; const int N=110; int n,m,q; ...
最新文章
- Cant find model en_core_web_sm
- GitHub 标星 2.5K+,U^2-Net 跨界肖像画,完美复刻人物细节!
- MySQL Cluster(MySQL 集群) 初试(转)
- 判断android应用程序是否已安装
- python爬虫知识点总结(十三)使用代理处理反扒抓取微信文章
- Flask出现Error code 400, message Bad request syntax异常
- 试用 Vista RC1 ,正式版离我们越来越近
- python strip_Python3 strip()方法
- 某些您可以编辑的区域交叠在一起 可能不能同时显示_DX200操作要领—修改与编辑程序(三十九)...
- [20170410]快速找回触发器内容.txt
- 真假难辨,AI就能分得清?
- codevs1253 超级市场(dp)
- 可视化讲解:什么是棒球游戏问题?
- CES 2022:四大芯片巨头正面厮杀,抢滩自动驾驶、元宇宙
- viz::viz3d报错_我可以在Excel中获得该Viz吗?
- Ubuntu16.04系统+GTX1050TI显卡的tensorflow1.6(GPU版)安装-详细图文
- 第69天-内网安全-域横向 CobaltStrikeSPNRDP
- 如何屏蔽UC强制嵌入到你网站页面上的垃圾广告
- 前端学习随笔 css篇
- 集成电路设计学习笔记(二)基于IC617反相器设计之原理图绘制