• 旅行计划


    题意:https://www.luogu.com.cn/problem/P1137

    小明要去一个国家旅游。这个国家有#NN个城市,编号为1至N,并且有MM条道路连接着,小明准备从其中一个城市出发,并只往东走到城市i停止。

    所以他就需要选择最先到达的城市,并制定一条路线以城市i为终点,使得线路上除了第一个城市,每个城市都在路线前一个城市东面,并且满足这个前提下还希望游览的城市尽量多。

    现在,你只知道每一条道路所连接的两个城市的相对位置关系,但并不知道所有城市具体的位置。现在对于所有的i,都需要你为小明制定一条路线,并求出以城市i为终点最多能够游览多少个城市。


    刚开始写的时候,傻乎乎的以为是最长路,可又不能对每个节点跑一次最长路。

    仔细想想,建立反向边也不好使,于是我画了个图。

     样例画出来是这样的。很明显以1为终点只能浏览到1

    为什么呢?因为1没有入度,没有指向它的边,这是不是在暗示我们拓扑呢?

    其实这是一个DP+拓扑。

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=200009;
    int dp[100009];
    struct p{
        int to,nxt,w; 
    }d[maxn];int cnt=1,head[maxn],dis[100009];
    void add(int u,int v,int w){
        d[cnt].to=v,d[cnt].w=w,
        d[cnt].nxt=head[u],head[u]=cnt++;
    }
    int indug[100009],n,m;
    void tuopu()
    {
        queue<int>q;
        for(int i=1;i<=n;i++)    if(indug[i]==0)    q.push(i);
        while(!q.empty())
        {
            int ans=q.front();q.pop();
            for(int i=head[ans];i;i=d[i].nxt)
            {
                int w=d[i].to;
                dp[w]=max(dp[w],dp[ans]+1);    
                if(--indug[w]==0)    q.push(w);
            }
        }
    }
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=m;i++)
        {
            int l,r;
            cin>>l>>r;
            add(l,r,1);
            indug[r]++;
        }
        tuopu();
        for(int i=1;i<=n;i++)
        cout<<dp[i]+1<<endl;
    }
  • 相关阅读:
    python入学代码
    python安装和pycharm安装与笔记
    python预习day1
    python-tyoira基本
    Typora基础
    学习一下saltstack 服务器批量管理
    消息队列与kafka
    消息队列rabbitmq
    redis数据库在linux上的学习
    蓝绿部署、滚动发布、灰度发布的介绍以及最佳实践
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12509853.html
Copyright © 2020-2023  润新知