• cojs 1175. [顾研NOIP] 旅游电车


    1175. [顾研NOIP] 旅游电车

    ★★☆   输入文件:buss.in   输出文件:buss.out   简单对比
    时间限制:1 s   内存限制:256 MB

    【问题描述】

    Henryy国正致力于首都的一个旅游电车建设工程。首都有N个旅游景区。Henryy国的电车永远只沿道路规定的方向行驶,为了不使投入使用的电车有可能无法回到它的起始站,Henryy希望知道他的首都的可以在哪些景区设置站点。一个景区可以被设置成车站,当且仅当对于任意一个从该景区出发所能到达的景区,均至少有一条路可回到该景区。你的同事已完成了一份景区之间的道路连通情况的报告。报告中将给出首都的景区数目N、道路总数M以及一些形如“景区A和景区B之间有一条从A到B的单向道路”的信息。现在明确你的任务:根据报告中的信息,列出所有可以被设置成车站的景区。

    【输入文件】

    输入文件由多份报告组成(这些报告相互无任何联系),每份报告包括:N,M,接下来M对整数Ai、Bi (1<=I<=M)表示Ai和Bi之间有一条单向道路Ai->Bi。仅一个包含整数N=0的报告表示你的工作结束,你的程序不应该对此有任何反应。各整数间用空格或空行分隔。对于任意景区,分别以该景区为起点或终点的道路总数均不超过50。

    【输出文件】

    对于每份报告,输出一行列表包括:所有能被设置成电车站点的景区编号,各编号之间用一个空格隔开。

    【样例输入】

    5 6
    1 2
    2 3
    3 4
    4 1
    2 5
    5 2
    1 0
    0

    【样例输出】

    1 2 3 4 5
    1

    【数据约定】

    对于40%的数据,有N<=200。
    对于100%的数据,有N<=5000,M<=50000。

    题解:

    很明显的缩点、重建图。重建图之后判断出度,没有出度的新点就可以设置站点。

    AC代码:

    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<stack>
    using namespace std;
    #define N 100010
    int n,m,sd,pd,id[N],low[N],dfn[N];
    bool mark[N];
    stack<int>s;
    vector<int>grap[N];
    void tarjan(int v){
        low[v]=dfn[v]=++pd;
        mark[v]=1;
        s.push(v);
        for(int i=0;i<grap[v].size();i++){
            int w=grap[v][i];
            if(!dfn[w]){
                tarjan(w);
                low[v]=min(low[v],low[w]);
            }
            else if(mark[w]){
                low[v]=min(low[v],dfn[w]);
            }
        }
        int u;
        if(low[v]==dfn[v]){
            sd++;
            do{
                u=s.top();
                s.pop();
                id[u]=sd;
                mark[u]=0;
            }while(u!=v);
        }
    }
    int main(){
        freopen("buss.in","r",stdin);
        freopen("buss.out","w",stdout);
        while(scanf("%d",&n)==1){
            if(!n) break;
            scanf("%d",&m);
            if(n==1&&m==0){printf("1");continue;}
            sd=0;pd=0;
            memset(low,0,sizeof low);
            memset(dfn,0,sizeof dfn);
            memset(mark,0,sizeof mark);
            memset(id,0,sizeof id);
            while(!s.empty()) s.pop();
            for(int i=1,x,y;i<=m;i++) scanf("%d%d",&x,&y),grap[x].push_back(y);
            for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
            int in[N]={0},out[N]={0};
            for(int i=1;i<=n;i++){
                for(int j=0;j<grap[i].size();j++){
                    int k=grap[i][j];
                    if(id[i]!=id[k]){
                        in[id[k]]++;
                        out[id[i]]++;
                    }
                }
            }
            for(int i=1;i<=n;i++) if(!out[id[i]]) printf("%d ",i);putchar('
    ');
            for(int i=1;i<=n;i++) grap[i].clear();
        }
        return 0;
    }
  • 相关阅读:
    How to Downgrade From iPhone Firmware 2.2 to 2.1 视频教程降级iphone 2.2 到2.1
    11种网站测试软件(转) 沧海一粟
    GoF23种设计模式之行为型模式之观察者模式
    Android柳叶刀之Button之图文并茂
    GoF23种设计模式之行为型模式之迭代器模式
    某大型银行深化系统之十九:日志规范
    GoF23种设计模式之行为型模式之中介者模式
    GoF23种设计模式之行为型模式之备忘录模式
    Android血刀之CheckBox之问卷调查
    Android应用开发之MetaData之数据挖掘
  • 原文地址:https://www.cnblogs.com/shenben/p/5838762.html
Copyright © 2020-2023  润新知