题意 有N(1<=N<=5000)个点,m条边(1<=M<=50000)。起点可以是任何一个入度为0的点,终点是N。求从起点到终点的所有路中,经过次数最大的一条路。输出经过次数。(规定每个点需要连接到编号更大的点,且不存在循环) 题解 该图为DAG(有向无环图),可利用拓扑排序,正反向建图分别进行两次拓扑排序。 根据乘法原理,在一条边M(u->v)上,通过边M的次数为从源点到达u的方式数量×从终点到达v的方式数量。 Code #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; struct node{ int to,next; }edge1[50005],edge2[50005]; int n,m; int cnt1,head1[5005],indegree1[5005],num1[5005]; int cnt2,head2[5005],indegree2[5005],num2[5005]; void add(int u,int v) { /*正向建图*/ edge1[cnt1].to=v; edge1[cnt1].next=head1[u]; head1[u]=cnt1++; /*反向建图*/ edge2[cnt2].to=u; edge2[cnt2