【p1137】旅行计划——拓扑排序

题面
每个点的答案等于 max(它的前驱节点答案+1
具体实现:邻接表存储+拓扑排序+dp处理
不过貌似CCF数据过水,没有dp处理也可以过 ???

code

#include<bits/stdc++.h>
using namespace std;
int n,m,f[100005],ru[100005];
int cnt,fro[100005],nxt[200005],to[200005];
queue<int>q;
inline int read() {
    int x=0; char c=getchar();
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return x;
}
void add(int x,int y) {
    to[++cnt]=y; nxt[cnt]=fro[x]; fro[x]=cnt;
}

int main() {
    n=read(); m=read();
    for(int i=1;i<=m;i++) {
    	int x=read(),y=read();
    	add(x,y); ru[y]++;
    }
    for(int i=1;i<=n;i++)
     if(ru[i]==0) {q.push(i); f[i]=1;}
    while(!q.empty()) {
        int x=q.front(); q.pop();
        for(int i=fro[x];i!=0;i=nxt[i]) {
            f[to[i]]=max(f[to[i]],f[x]+1); 
            if(--ru[to[i]]==0) q.push(to[i]);
        }
    }
    for(int i=1;i<=n;i++) 
     for(int j=fro[i];j!=0;j=nxt[j])
      f[to[j]]=max(f[to[j]],f[i]+1);
    for(int i=1;i<=n;i++) printf("%d\n",f[i]);
    return 0;
}    

猜你喜欢

转载自blog.csdn.net/MiaoZ_/article/details/84196464