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 }