zoukankan      html  css  js  c++  java
  • 洛谷P1137 旅行计划

    题目描述

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

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

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

    输入输出格式

    输入格式:

    输入的第1行为两个正整数N, M。

    接下来M行,每行两个正整数x, y,表示了有一条连接城市x与城市y的道路,保证了城市x在城市y西面。

    输出格式:

    输出包括N行,第i行包含一个正整数,表示以第i个城市为终点最多能游览多少个城市。

    输入输出样例

    输入样例#1: 复制
    5 6
    1 2
    1 3
    2 3
    2 4
    3 4
    2 5
    
    输出样例#1: 复制
    1
    2
    3
    4
    3
    

    说明

    均选择从城市1出发可以得到以上答案。

    对于20%的数据,N ≤ 100;

    对于60%的数据,N ≤ 1000;

    对于100%的数据,N ≤ 100000,M ≤ 200000。

    裸地拓扑排序+裸地DP

    dp[i]表示到达第i号节点能观察到的最多的城市

    转移方程很简单:dp[将要去的节点]=dp[现在的节点]+1

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 using namespace std;
     5 const int MAXN=400001;
     6 inline int read()
     7 {
     8     char c=getchar();int x=0,flag=1;
     9     while(c<'0'||c>'9')    {if(c=='-')    flag=-1;c=getchar();}
    10     while(c>='0'&&c<='9')    x=x*10+c-48,c=getchar();return x*flag;
    11 }
    12 int n,m;
    13 struct node
    14 {
    15     int u,v,nxt;
    16 }edge[MAXN];
    17 int head[MAXN];
    18 int num=1;
    19 inline void add_edge(int x,int y)
    20 {
    21     edge[num].u=x;
    22     edge[num].v=y;
    23     edge[num].nxt=head[x];
    24     head[x]=num++;
    25 }
    26 int dp[MAXN];//到达i所能经过的最多城市数
    27 int rudu[MAXN];
    28 inline void Topsort()
    29 {
    30     queue<int>q;
    31     for(int i=1;i<=n;i++)
    32         if(rudu[i]==0)
    33             dp[i]=1,q.push(i);
    34     while(q.size()!=0)
    35     {
    36 
    37         int p=q.front();q.pop();
    38         for(int i=head[p];i!=-1;i=edge[i].nxt)
    39         {
    40             dp[edge[i].v]=max(dp[edge[i].v],dp[p]+1);
    41             rudu[edge[i].v]--;
    42             if(rudu[edge[i].v]==0)
    43                 q.push(edge[i].v);
    44         }
    45     }    
    46 } 
    47 int main()
    48 {
    49     n=read(),m=read();
    50     memset(head,-1,sizeof(head));
    51     for(int i=1;i<=m;i++)
    52     {
    53         int x=read(),y=read();
    54         add_edge(x,y);
    55         rudu[y]++;
    56     }
    57     Topsort();
    58     for(int i=1;i<=n;i++)
    59         printf("%d
    ",dp[i]);
    60     return 0;
    61 }
  • 相关阅读:
    struts1 Hibernate3初学
    java学习笔记
    改良程序需要的11个技巧
    SharePoint 2010 PowerShell 系列 之 应用总结
    PowerPivot for excel 100 Create KPI
    Sharepoint 2010 控件系统 之 扩展 SaveButton
    Entity Framework 5 一个模型多个关系图 期待已久了
    PowerPivot for Sharepoint 2010 配制及常见错误
    SharePoint 2010 PowerShell 系列 之 应用总结 (二)
    Sharepoint 2010 控件系统 之 TextField、LookupField、NoteField、RichTextField、SaveButton
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7724995.html
Copyright © 2011-2022 走看看