P1807 最长路

题目链接 https://www.luogu.com.cn/problem/P1807

拓扑排序求DAG(有向无环图)的最长路。

放AC代码

复制代码
 1 #include<bits/stdc++.h>
 2 #define MAX 50010
 3 using namespace std;
 4 int n,m,cnt;
 5 int head[MAX];
 6 int in[MAX];
 7 int dis[MAX];
 8 queue<int>q;
 9 
10 struct node
11 {
12     int v,w,next;
13 }edge[MAX];
14 
15 void add(int u,int v,int w)
16 {
17     edge[++cnt].v=v;
18     edge[cnt].w=w;
19     edge[cnt].next=head[u];
20     head[u]=cnt;
21 }
22 
23 int main()
24 {
25     int n,m;
26     cin>>n>>m;
27     while(m--)
28     {
29         int u,v,w;
30         cin>>u>>v>>w;
31         add(u,v,w);
32         in[v]++;
33     }
34     memset(dis,-0x7f,sizeof(dis));
35     dis[1]=0;
36     for(int i=1; i<=n; i++)
37         if(!in[i]) q.push(i);//将入度为0的点入队
38     while(!q.empty())
39     {
40         int x=q.front();
41         q.pop();
42         for(int i=head[x]; i; i=edge[i].next)
43         {//像是最短路径,只是把min换成max
44             in[edge[i].v]--;//入度-1
45             dis[edge[i].v]=max(dis[edge[i].v],dis[x]+edge[i].w);//更新,即:
46             //这个点的值最大=max(这个点原来的值,他的前驱节点+连接前驱和他自己的边的值)
47             if(in[edge[i].v]==0) q.push(edge[i].v);//如果入度为0则入队
48         }
49     }
50     if(dis[n]<0) cout<<-1<<endl;//不取0,因为可能所有的边的权值都为0
51     else cout<<dis[n]<<endl;
52     return 0;
53 }
复制代码

 

posted @   爱吃虾滑  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示