【洛谷p1137】旅行计划

这个题开始我以为打个最短路能过……但是仔细阅读题意发现起点是不确定的,所以不可能用最短路

我们可以看出,这个图是个DAG,因为他说,所有的路都是从西向东,不可能存在环,所以我们可以跑个拓扑排序,一边跑一边求答案

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
queue<int>qwq; 
int n,m,x,y,ans[100010],head[100010],tail,ru[100010];
struct in
{
    int to,ne;
}ter[200020];
inline void build(int f,int l)
{
    ter[++tail]=(in){l,head[f]},head[f]=tail;
}
int main()
{
    memset(head,-1,sizeof(head));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
        scanf("%d%d",&x,&y),build(x,y),ru[y]++; 
    for(int i=1;i<=n;i++)
        if(!ru[i])
            qwq.push(i),ans[i]=1;//所有入度为0的点答案都是确定的 
    while(!qwq.empty())
    {
        int qaq=qwq.front();
        for(int i=head[qaq];i>0;i=ter[i].ne)
        {
            int t=ter[i].to;
            ans[t]=max(ans[t],ans[qaq]+1),ru[t]--;//取个最大值,入度减一 
            if(!ru[t])
                qwq.push(t);//入度为0就入队 
        }
        qwq.pop();
    }
    for(int i=1;i<=n;i++)
        printf("%d\n",ans[i]);
}

 

posted @ 2017-10-21 14:53  那一抹落日的橙  阅读(89)  评论(0编辑  收藏  举报