【题解】

  先建反向图,然后跑拓扑排序求出最长路。

  将所有的点按照最长路从小到大分层,把上一层连向这一层的边按照边权为第一关键字、起点的排名为第二关键字排序。

  按照这个顺序更新这一层的答案,按照这一层每个点被更新的顺序得到这一层的点的排名。

 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 最长路相关推荐

  1. 牛客网NOIP赛前集训营 提高组(第七场)

    中国式家长 2 链接:https://www.nowcoder.com/acm/contest/179/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K ...

  2. 牛客网NOIP赛前集训营-普及组(第一场)

    前三题略 T4: 题目描述 小A有n个长度都是L的字符串.这些字符串只包含前8个小写字符,'a'~'h'.但这些字符串非常的混乱,它们几乎长得互不相同.小A想通过一些规则,让它们长得尽可能相同.小A现 ...

  3. 牛客网NOIP赛前集训营-提高组(第六场)B-选择题

    题目描述 有一道选择题,有 a,b,c,d 四个选项. 现在有 n 个人来做这题,第 i 个人有 pi,j 的概率选第 j 个选项. 定义\(cnt(x)\)为选第$ x $个选项的人数. 令\(mx ...

  4. 牛客网NOIP赛前集训营-提高组(第六场)B-选择题[背包]

    题意 题目链接 分析 直接背包之后可以 \(O(n)\) 去除一个物品的影响. 注意特判 \([p==1]\) 的情况. 总时间复杂度为 \(O(n^2)\) . 代码 #include<bit ...

  5. 牛客网NOIP赛前集训营 提高组 第5场 T2 旅游

    [题解] 我们可以发现不在最小生成树上的边一定不能多次经过,因为一条不在最小生成树上的边(u,v)的边权比最小生成树上(u,v)之间的路径更长,选择不在最小生成树上的边一定不划算. 我们还需要确定最小 ...

  6. [NowCoder]牛客网NOIP赛前集训营-提高组(第六场)题解

    A.最长路 题意:给定有向图,每条边有个字符\([0,10^9]\),求每个点最长路字典序最小的方案.\(N,M\le 10^6\) 建反图跑拓扑排序,显然入过队的点都有最长路,考虑如何判断字典序大小 ...

  7. 牛客网NOIP赛前集训营-提高组(第七场)C 洞穴

    洞穴 思路: 矩阵乘法 由于只需要知道 A ^ l 的 第a行第b个元素 所以我们每次在做矩阵乘法时只需要算第a行就可以了 还要像矩阵快速幂一样预处理A ^ (1<<d) 代码: #pra ...

  8. 牛客网NOIP赛前集训营-提高组(第七场)C-洞穴

    题目描述 有一天,牛牛找到了一个巨大的洞穴.洞穴可以描述成一个有向图,一共有\(N\)个节点(从\(1\)到\(N\)编号)和\(M\)条长度为\(1\)的有向边,每条边从某一个节点\(u\)连向另一 ...

  9. 【题解】[牛客网NOIP赛前集训营-提高组(第七场)]C.洞穴 倍增优化DP+bitset

    题目链接 #include<cstdio> #include<bitset> using namespace std; const int N=110; int n,m,q; ...

最新文章

  1. Cant find model en_core_web_sm
  2. GitHub 标星 2.5K+,U^2-Net 跨界肖像画,完美复刻人物细节!
  3. MySQL Cluster(MySQL 集群) 初试(转)
  4. 判断android应用程序是否已安装
  5. python爬虫知识点总结(十三)使用代理处理反扒抓取微信文章
  6. Flask出现Error code 400, message Bad request syntax异常
  7. 试用 Vista RC1 ,正式版离我们越来越近
  8. python strip_Python3 strip()方法
  9. 某些您可以编辑的区域交叠在一起 可能不能同时显示_DX200操作要领—修改与编辑程序(三十九)...
  10. [20170410]快速找回触发器内容.txt
  11. 真假难辨,AI就能分得清?
  12. codevs1253 超级市场(dp)
  13. 可视化讲解:什么是棒球游戏问题?
  14. CES 2022:四大芯片巨头正面厮杀,抢滩自动驾驶、元宇宙
  15. viz::viz3d报错_我可以在Excel中获得该Viz吗?
  16. Ubuntu16.04系统+GTX1050TI显卡的tensorflow1.6(GPU版)安装-详细图文
  17. 第69天-内网安全-域横向 CobaltStrikeSPNRDP
  18. 如何屏蔽UC强制嵌入到你网站页面上的垃圾广告
  19. 前端学习随笔 css篇
  20. 集成电路设计学习笔记(二)基于IC617反相器设计之原理图绘制

热门文章

  1. 字节面试:如何用Redis实现一个分布式锁?
  2. 社保必须交满15年才能享受吗?
  3. 为什么坚持一件事总是那么难,而且有时候总是三分钟热度?
  4. htaccess是什么文件
  5. 酒局中同事说“不把这杯酒喝了就是不给我面子”,我该怎么办?
  6. iPhone8用的全面屏是什么屏幕?
  7. 转专业有什么要求吗?
  8. 汽车车灯有必要改造成氙气大灯吗?
  9. 你是农村人吗,小时候放过牛吗,都有哪些好玩的趣事?
  10. 老年人用什么方式存款最好?