http://www.cogs.pro/cogs/problem/problem.php?pid=1175
★★☆ 输入文件: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。
- 缩点后的新图中,出去为零的强连通里包含的点、
1 #include <cstring> 2 #include <cstdio> 3 4 const int N(5000+15); 5 const int M(50000+5); 6 int head[N],sumedge; 7 struct Edge 8 { 9 int v,next; 10 Edge(int v=0,int next=0):v(v),next(next){} 11 }edge[M]; 12 inline void ins(int u,int v) 13 { 14 edge[++sumedge]=Edge(v,head[u]); 15 head[u]=sumedge; 16 } 17 18 #define min(a,b) (a<b?a:b) 19 int tim,dfn[N],low[N]; 20 int top,Stack[N],instack[N]; 21 int col[N],sumcol,cd[N]; 22 void DFS(int u) 23 { 24 low[u]=dfn[u]=++tim; 25 Stack[++top]=u; instack[u]=1; 26 for(int v,i=head[u];i;i=edge[i].next) 27 { 28 v=edge[i].v; 29 if(!dfn[v]) DFS(v), low[u]=min(low[u],low[v]); 30 else if(instack[v]) low[u]=min(low[u],dfn[v]); 31 } 32 if(low[u]==dfn[u]) 33 { 34 col[u]=++sumcol; 35 for(;Stack[top]!=u;top--) 36 { 37 instack[Stack[top]]=0; 38 col[Stack[top]]=sumcol; 39 } 40 instack[u]=0; top--; 41 } 42 } 43 44 inline void init() 45 { 46 sumedge=tim=top=sumcol=0; 47 memset(cd,0,sizeof(cd)); 48 memset(low,0,sizeof(low)); 49 memset(dfn,0,sizeof(dfn)); 50 // memset(col,0,sizeof(col)); 51 memset(edge,0,sizeof(edge)); 52 memset(head,0,sizeof(head)); 53 // memset(Stack,0,sizeof(Stack)); 54 memset(instack,0,sizeof(instack)); 55 } 56 inline void read(int &x) 57 { 58 x=0; register char ch=getchar(); 59 for(;ch>‘9‘||ch<‘0‘;) ch=getchar(); 60 for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘; 61 } 62 63 int AC() 64 { 65 freopen("buss.in","r",stdin); 66 freopen("buss.out","w",stdout); 67 for(int n,m;1;init()) 68 { 69 read(n); 70 if(!n) break; 71 read(m); 72 for(int u,v;m--;ins(u,v)) 73 read(u),read(v); 74 for(int i=1;i<=n;i++) 75 if(!dfn[i]) DFS(i); 76 for(int v,u=1;u<=n;u++) 77 for(int i=head[u];i;i=edge[i].next) 78 { 79 v=edge[i].v; 80 if(col[u]!=col[v]) cd[col[u]]++; 81 } 82 for(int i=1;i<=n;i++) 83 if(!cd[col[i]]) printf("%d ",i); 84 puts(""); 85 } 86 return 0; 87 } 88 89 int Hope=AC(); 90 int main(){;}
时间: 2024-10-11 05:56:00