1. 程式人生 > >COGS——T 1175. [顧研NOIP] 旅遊電車

COGS——T 1175. [顧研NOIP] 旅遊電車

target 永遠 組成 eof str pre std 旅遊景區 一個空格

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(){;}

COGS——T 1175. [顧研NOIP] 旅遊電車