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(‘\n‘);
        for(int i=1;i<=n;i++) grap[i].clear();
    }
    return 0;
}
时间: 2024-12-27 07:56:45

cojs 1175. [顾研NOIP] 旅游电车的相关文章

COGS——T 1175. [顾研NOIP] 旅游电车

http://www.cogs.pro/cogs/problem/problem.php?pid=1175 ★★☆   输入文件:buss.in   输出文件:buss.out   简单对比时间限制:1 s   内存限制:256 MB [问题描述] Henryy国正致力于首都的一个旅游电车建设工程.首都有N个旅游景区.Henryy国的电车永远只沿道路规定的方向行驶,为了不使投入使用的电车有可能无法回到它的起始站,Henryy希望知道他的首都的可以在哪些景区设置站点.一个景区可以被设置成车站,当且

旅游电车

[题目描述] 首都有N个旅游景区,电车只沿道路规定的方向行驶,为了不使投入使用的电车有可能无法回到它的起始站,人们希望知道可以在哪些景区设置站点. 一个景区可以被设置成车站,当且对于任意一个从该景区出发所能到达的景区,均至少有一条路可回到该景区.现已完成了一份景区之间的道路连通情况的报告,报告中将给出首都的景区数目N.道路总数M以及一些形如“景区A和景区B之间有一条从A到B的单向道路”的信息.根据报告中的信息,列出所有可以被设置成车站的景区. [输入描述] 输入由多份报告组成(这些报告相互无任何

【转】[专题学习][计算几何]

原文地址:http://www.cnblogs.com/ch3656468/archive/2011/03/02/1969303.html 基本的叉积.点积和凸包等东西就不多说什么了,网上一搜一大堆,切一些题目基本熟悉了就差不多了. 一些基本的题目可以自己搜索,比如这个blog:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html 接下来,研究了半平面交,思想方法看07年朱泽园的国家队论文,模板代码参考自我校大牛韬哥: http://www.o

Ural 1520 Empire Strikes Back(模拟退火)

最近研究了下模拟退火,首先戳这里>_<顾研08年集训队论文,讲的非常详细 首先随机20个点作为候选解,以此扩展来确定距离工厂最近的点的最远的距离是多少.但是有需要注意到扩展点在边界的情况,因为边界是圆所以很难继续扩展,如论文中提到的两种情况.1.是两工厂垂直平分线与边界交点2.一个工厂的圆与边界相切.单独判断即可. 其中有个很蛋疼的地方,我之前距离用了很多次sqrt,T成狗,比较距离时只需比较距离平方,答案最后再开根即可 代码:https://github.com/mlz000/Ural/bl

【转】国家集训队论文分类整理 作者:洪雁书

距离NOI时间越来越少了,选择性地看一些集训队论文是很有必要的. (在此给已经看过所有论文的神牛跪了= =) 所以,我在此整理了一下,供大家参考. 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬:<生成树的计数及其应用> 2008 - 陈瑜希<Pólya计数法的应用> 数位问题 2009 - 高逸涵<数位计数问题解法研究> 2009 - 刘聪

【资料】国家集训队论文集(1999~2014)

本文版权归ACShiryu和acvay所有,如转载请注明原作者. 国家集训队1999论文集 1.陈宏:<数据结构的选择与算法效率--从IOI98试题PICTURE谈起> 2.来煜坤:<把握本质,灵活运用--动态规划的深入探讨> 3.齐鑫:<搜索方法中的剪枝优化> 4.邵铮:<数学模型的建立.比较和应用> 5.石润婷:<隐蔽化.多维化.开放化--论当今信息学竞赛中数学建模的灵活性> 6.杨帆:<准确性.全面性.美观性--测试数据设计中的三要素

国家集训队论文

组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬:<生成树的计数及其应用> 2008 - 陈瑜希<Pólya计数法的应用> 数位问题 2009 - 高逸涵<数位计数问题解法研究> 2009 - 刘聪<浅谈数位类统计问题> 动态统计 2004 - 薛矛:<解决动态统计问题的两把利刃> 2007 - 余江伟:<如何解决

国家集训队论文整理分类

组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬:<生成树的计数及其应用> 2008 - 陈瑜希<Pólya计数法的应用> 数位问题 2009 - 高逸涵<数位计数问题解法研究> 2009 - 刘聪<浅谈数位类统计问题> 动态统计 2004 - 薛矛:<解决动态统计问题的两把利刃> 2007 - 余江伟:<如何解决

Poj1379(模拟退火

题目:在矩形中有若干个点,求一个点使得所有点到该点的最小距离最大. 思路:这个是2008年顾研论文上的例题,可以比较简单地用模拟退火算法求解.所谓模拟退火就是先随机出若干个点,然后以某一特定步长尝试周围的解,而后逐渐缩小步长,知道步长小于特定值,跳出.这个算法虽然简单易行,但是其正确性并不是非常有保障,(不合理的随机方法可能会降低到达正确解的概率),而且几个主要参数的选取也主要看经验,毕竟对于一个随机化算法做出像论文中一样的严格评估还是比较困难的....所以说即使实现完全正确,能否通过有时也是玄