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

    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。

     (WA)
    1
    #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<queue> 5 6 using namespace std; 7 const int N=1001; 8 9 struct node{ 10 int u,v,w,nxt; 11 }; 12 node e[N]; 13 int head[N]; 14 int ans[N]; 15 int rd[N]; 16 int now=1; 17 queue<int>q; 18 int t; 19 int n,m; 20 int answer; 21 int flag=1; 22 23 void add(int u,int v) 24 { 25 e[now].v=v; 26 e[now].u=u; 27 e[now].nxt=head[u]; 28 head[u]=now++; 29 } 30 31 void topsort() 32 { 33 for(int i=1;i<=n;i++) 34 { 35 if(rd[i]==0) 36 { 37 q.push(i); 38 ans[i]++; 39 break; 40 } 41 } 42 while(q.empty()) 43 { 44 int top=q.front(); 45 q.pop(); 46 for(int i=head[top];i!=-1;i=e[i].nxt)//ibiaoshi dijitiaobian cuowu 47 { 48 int u=e[i].u,v=e[i].v; 49 rd[v]--; 50 if(rd[v]==0) 51 { 52 q.push(v); 53 ans[v]++; 54 ans[v]+=ans[u]; 55 } 56 } 57 } 58 } 59 60 void redayac() 61 { 62 for(int i=1;i<=n;i++) 63 { 64 cout<<ans[i]<<endl; 65 } 66 } 67 68 int main() 69 { 70 71 cin>>n>>m; 72 for(int i=1;i<=n;i++) 73 { 74 head[i]=-1; 75 } 76 for(int i=1;i<=m;i++) 77 { 78 int u,v,w; 79 cin>>u>>v; 80 rd[v]++; 81 add(u,v); 82 } 83 topsort(); 84 redayac(); 85 }

    犯了个小错误,上代码39行不能break;why,吾吧;

    呈上AC代码

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    
    using namespace std;
    const int N=2000001;
    
    struct node{
        int u,v,w,nxt;
    };
    node e[N];
    int head[N];
    int ans[N];
    int rd[N];
    int now=1;
    queue<int>q;
    int t;
    int n,m;
    int answer;
    int flag=1;
    
    void add(int u,int v)
    {
        e[now].v=v;
        e[now].u=u;
        e[now].nxt=head[u];
        head[u]=now++;
    }
    
    void topsort()
    {
        for(int i=1;i<=n;i++)
        {
            if(rd[i]==0)
            {
                q.push(i);
                ans[i]++;  
            }
        }
        while(!q.empty())
        {
            int top=q.front();
            q.pop();
            for(int i=head[top];i!=-1;i=e[i].nxt)
            {
                int u=e[i].u,v=e[i].v;
                rd[v]--;
                if(rd[v]==0)
                {
                    q.push(v);
                    ans[v]++;
                    ans[v]+=ans[u];
                }
            }
        }
    }
    
    void redayac()
    {
        for(int i=1;i<=n;i++)
        {
            cout<<ans[i]<<endl;
        }
    }
    
    int main()
    {
        
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            head[i]=-1;
        }
        for(int i=1;i<=m;i++)
        {
            int u,v,w;
            cin>>u>>v;
            rd[v]++;
            add(u,v);
        }
        topsort();
        redayac();
    }
  • 相关阅读:
    17. Letter Combinations of a Phone Number
    16. 3Sum Closest
    15. 3Sum
    14. Longest Common Prefix
    13. Roman to Integer
    12. Integer to Roman
    11. Container With Most Water
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/6795151.html
Copyright © 2011-2022 走看看