旅游电车(cogs 1175)
【问题描述】
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。
/*
tarjan算法
题目要求求出的点满足它能连到的点也能连回来,那么就一定要与它在同一缩点中,如果一个缩点出度大于1,那么这个缩点中的所有点都不满足要求。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define M 5010
using namespace std;
int num[M],low[M],instack[M],vis[M],belong[M],out[M],a[M][M],s [M*],cnt,indexx,top;
int head[M],n,m,ans[M];
struct node
{
int v,pre;
};node e[M*];
int read()
{
char c=getchar();int num=,flag=;
while(c<''||c>''){if(c=='-')flag=-;c=getchar();}
while(c>=''&&c<=''){num=num*+c-'';c=getchar();}
return num*flag;
}
void add(int i,int x,int y)
{
e[i].v=y;
e[i].pre=head[x];
head[x]=i;
}
void tarjan(int v)
{
num[v]=low[v]=++indexx;
vis[v]=instack[v]=;
s[++top]=v;
for(int i=head[v];i;i=e[i].pre)
{
int w=e[i].v;
if(!vis[w])
{
tarjan(w);
low[v]=min(low[v],low[w]);
}
else if(instack[w])
low[v]=min(low[v],num[w]);
}
int u;
if(num[v]==low[v])
{
++cnt;
do
{
u=s[top--];
instack[u]=;
belong[u]=cnt;
a[cnt][++a[cnt][]]=u;
}while(u!=v);
}
}
void work()
{
for(int i=;i<=m;i++)
{
int x=read(),y=read();
add(i,x,y);
}
for(int i=;i<=n;i++)
if(!vis[i])tarjan(i);
for(int i=;i<=n;i++)
for(int j=head[i];j;j=e[j].pre)
if(belong[i]!=belong[e[j].v])
out[belong[i]]++;
int k=;
for(int i=;i<=cnt;i++)if(!out[i])
for(int j=;j<=a[i][];j++)
ans[++k]=a[i][j];
sort(ans+,ans+k+);
for(int i=;i<=k;i++)
printf("%d ",ans[i]);
printf("\n");
}
int main()
{
freopen("buss.in","r",stdin);
freopen("buss.out","w",stdout);
while()
{
n=read();if(!n)break;
m=read();
memset(head,,sizeof(head));
memset(num,,sizeof(num));
memset(low,,sizeof(low));
memset(vis,,sizeof(vis));
memset(instack,,sizeof(instack));
memset(s,,sizeof(s));
memset(e,,sizeof(e));
memset(belong,,sizeof(belong));
memset(out,,sizeof(out));
memset(a,,sizeof(a));
indexx=cnt=top=;
work();
}
return ;
}
旅游电车(cogs 1175)的更多相关文章
- COGS——T 1175. [顾研NOIP] 旅游电车
http://www.cogs.pro/cogs/problem/problem.php?pid=1175 ★★☆ 输入文件:buss.in 输出文件:buss.out 简单对比时间限制: ...
- cojs 1175. [顾研NOIP] 旅游电车
1175. [顾研NOIP] 旅游电车 ★★☆ 输入文件:buss.in 输出文件:buss.out 简单对比时间限制:1 s 内存限制:256 MB [问题描述] Henryy国正致 ...
- AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867
[国家集训队2011]旅游(宋方睿) 思路: 树链剖分,边权转点权: 线段树维护三个东西,sum,max,min: 当一个区间变成相反数时,sum=-sum,max=-min,min=-max: 来, ...
- BZOJ 2157: 旅游( 树链剖分 )
树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...
- 旅游公司招聘Java工程师
公司招聘:岗位要求如下 Java开发工程师工作内容1.根据需求完成软件系统代码的开发,测试以及文档撰写工作:2.分析并解决客户的问题:3.配合业务部门进行数据分析以及系统优化 岗位要求:1.本科以上学 ...
- 基于GIS的旅游辐射区人口统计
在旅游规划中,考虑旅游景点周边的人口负载量是很重要的一个方面,这将直接影响资源的投入和配置,开发潜力和规模等.基于GIS可以将人口信息进行空间化的展示,还可以通过空间分析的方法计算出旅游景点辐射区的人 ...
- Java基础-多线程编程-1.随便选择两个城市作为预选旅游目标。实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市。分别用Runnable接口和Thread类实现。
1.随便选择两个城市作为预选旅游目标.实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市.分别用Runnable接口和Thread ...
- 中国175个 AAAAA级风景区,去过20个 以上,你就是旅游达人
省份 数量 景区名称 我 北京 7 故宫博物院 1 天坛公园 颐和园 1 八达岭-慕田峪长城旅游区 1 明十三陵景区(神路-定陵-长陵-昭陵) 恭王府景区 北京奥林匹克公园(鸟巢-水立方-中国科技馆- ...
- VR技术驱动智慧旅游,自由漫步西湖不是梦
虚拟现实技术是今年最热门的科技之一,不少行业都在嫁接VR功能,其中旅游业也具备这方面的优势.VR+旅游,能让你足不出户即可感受清净唯美的名胜古迹.据591ARVR资讯网www.591arvr ...
随机推荐
- 认识BACnet协议
一.什么是BACnet? BACnet,Building Automation and Control networks的简称,即楼宇自动化与控制网络.是用于智能建筑的通信协议. 一般楼宇自控设备从功 ...
- 如何保证access_token长期有效--微信公众平台开发
http://blog.csdn.net/qq_33556185/article/details/52758781 import javax.servlet.ServletContext; impor ...
- lua调用java java调用lua[转载]
转载:http://dualface.github.io/blog/2013/01/01/call-java-from-lua/LuaJavaBridge - Lua 与 Java 互操作的简单解决方 ...
- [转]URL最大长度问题
本文转自:http://www.cnblogs.com/henryhappier/archive/2010/10/09/1846554.html 今天在测试Email Ticket的时候发现在进行Ma ...
- NodeJs学习记录(六)使用 res.locals 传递参数到页面
res.locals的生命周期是单次请求,有点类似于java servlet 里的 httpServletRequest.setAttribute("param1",1); 既然 ...
- elastic-job 的简单使用
说明:这个是使用2.1.5版本 elastic-job是当当开源的的的定时任务,使用也是很简单的,可以解决数据量的大的时候可以分片执行,多应用节点部署时候不会重复执行. 是通过zookeeper作为控 ...
- kill 8080 port on windows
1. 查找PID netstat -ano | findstr :yourPortNumber 2. kill进程 taskkill /PID typeyourPIDhere /F
- PSP需求分析文档
PSP软件需求分析文档 刘杰 1. 引言 1.1 背景 开发项目经常延期不能按时提交,甚至不能给出明确的延迟时间 1.2 术语 PSP,数据库 2. 任务概述 2.1 目 ...
- canvas一周一练 -- canvas绘制太极图(6)
运行效果: <!DOCTYPE html> <html> <head> </head> <body> <canvas id=" ...
- Shell输入/输出重定向
输出重定向 重定向一般通过在命令间插入特定的符号来实现.特别的,这些符号的语法如下所示 command1 >file1 上面这个命令执行command1然后将输出的内容存入file1. 注意任何 ...