拓扑排序+dfs
很容易发现 对于一个点i 到达它经过的最多的城市数等于前一个节点的数量+1
求出每个点前面最多有多少个点就是答案
//P1137 旅行计划 #include<bits/stdc++.h> using namespace std; vector<int> g[100005]; int s[100005],out[100005],in[100005]; inline void add(int u,int v){ g[u].push_back(v); out[u]++; in[v]++; } inline int dfs(int x){ if(!out[x]){ s[x]=1; return 1; } if(s[x]) return s[x]; int sz=g[x].size(); int sum=0; for(int i=0;i<sz;i++){ sum=max(dfs(g[x][i]),sum); } s[x]=sum+1; return s[x]; } int main(){ int n,m; cin>>n>>m; for(int i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); add(y,x); } for(int i=1;i<=n;i++){ if(!in[i]) dfs(i); } for(int i=1;i<=n;i++){ cout<<s[i]<<endl; } return 0; }