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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现