算法思路
其实就是一道拓扑排序+动态规划题,只不过要记录出度为0的点,作为最佳消费者。在某点后的每条分支最长的路径数=点前的最长路径数,明白这两点这题就很简单了。拓扑排序:记录入度-入度为0点入栈-找新的入度为0的点
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<stack>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
vector<vector<int>> g(n+1);
vector<int> indegree(n+1,0),outdegree(n+1,0);
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v;
g[u].emplace_back(v);
outdegree[u]++,indegree[v]++;
}
stack<int> stk;
vector<int> num(n+1,0);
for(int i=1;i<=n;i++){
if(!indegree[i]){
stk.push(i);
num[i]=1;
}
}
while(!stk.empty()){
int u=stk.top();stk.pop();
for(auto & v:g[u]){
num[v]=num[v]+num[u];
if(--indegree[v]==0) stk.push(v);
}
}
long long ans=0;
for(int i=1;i<=n;i++){
if(!outdegree[i]){
ans+=num[i];
}
}
cout<<ans;
}