洛谷P1137 旅行计划

来源:互联网 发布:浪潮大数据解决方案 编辑:程序博客网 时间:2024/05/19 02:18

拓扑排序 DP

题目传送门

首先进行拓扑排序,然后按照拓扑序进行DP

对于每个点,更新它指向点的DP值。即ans[ed[j].to]=max(ans[ed[j].to],ans[tp[i]]+1)

代码:

#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 100000#define MAXM 200000using namespace std;struct edge{    int next,to;}ed[MAXM+5];int n,m,k,t;int h[MAXN+5],f[MAXN+5],tp[MAXN],in[MAXN+5];inline char readc(){    static char buf[100000],*l=buf,*r=buf;    if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);    if (l==r) return EOF; return *l++;}inline int _read(){    int num=0; char ch=readc();    while (ch<'0'||ch>'9') ch=readc();    while (ch>='0'&&ch<='9') { num=num*10+ch-48; ch=readc(); }    return num;}inline void _write(int x){    static int buf[20],len=0;    do{ buf[len++]=x%10; x/=10; } while (x);    while (len) putchar(buf[--len]+48); putchar('\n');}void Tp(){    int que[MAXM],r=0,w=0;    for (int i=1;i<=n;i++)        if (!in[i]) que[++w]=i,tp[++t]=i;    while (r<w){        int x=que[++r];        for (int i=h[x];i;i=ed[i].next){            in[ed[i].to]--;            if (!in[ed[i].to])                que[++w]=ed[i].to,tp[++t]=ed[i].to;        }    }}void addedge(int x,int y){    ed[++k].next=h[x]; ed[k].to=y; h[x]=k;}int main(){    scanf("%d%d",&n,&m);    for (int i=1;i<=m;i++){        int u=_read(),v=_read();        addedge(u,v); in[v]++;    }    Tp();    for (int i=1;i<=n;i++)        for (int j=h[tp[i]];j;j=ed[j].next)            f[ed[j].to]=max(f[tp[i]]+1,f[ed[j].to]);    for (int i=1;i<=n;i++)        _write(f[i]+1);    return 0;}
原创粉丝点击