P1137 旅行计划

拓扑排序+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;
}

 

posted @ 2019-10-21 16:20  DUO_JIaMInG  阅读(127)  评论(0)    收藏  举报