P1137 旅行计划
这个城市的路线只能由前面的城市过来(拓扑结构),因此跟自己前面最大经过城市数 +1 比较取最大即可
const int N=1e5+10;
vector<int> g[N];
int f[N];
int din[N];
int n,m;
void topo()
{
for(int i=1;i<=n;i++) f[i]=1;
queue<int> q;
for(int i=1;i<=n;i++)
if(!din[i])
q.push(i);
while(q.size())
{
int t=q.front();
q.pop();
for(int i=0;i<g[t].size();i++)
{
int j=g[t][i];
f[j]=max(f[j],f[t]+1);
if(--din[j] == 0) q.push(j);
}
}
}
int main()
{
cin>>n>>m;
while(m--)
{
int a,b;
cin>>a>>b;
g[a].push_back(b);
din[b]++;
}
topo();
for(int i=1;i<=n;i++) cout<<f[i]<<endl;
//system("pause");
}