旅遊電車(tarjan演算法 統計出度)

2021-07-22 09:44:58 字數 1812 閱讀 9206

問題描述:

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演算法+統計出度

#include

#include

#include

#include

using

namespace

std;

const

int maxn=50010;

int n,m,tot,head[maxn];

int top,b[maxn],out[maxn],s[maxn],stack[maxn],low[maxn],dfn[maxn];

bool in[maxn];

struct node

e[maxn*2];

void add_edge(int u,int v)

void tarjan(int u)

else

if(in[v])

low[u]=min(low[u],dfn[v]);

}if(low[u]==dfn[u])

while(u!=v);

}}int main()

tot=0;

for(int i=1;i<=n;i++)

if(!dfn[i])

tarjan(i);tot=0;

for(int i=1;i<=n;i++)

for(int j=head[i];j;j=e[j].next)

if(b[i]!=b[e[j].to])

out[b[i]]++;

for(int i=1;i<=n;i++)

if(!out[b[i]])

s[++tot]=i;

sort(s+1,s+tot+1);

for(int i=1;i<=tot;i++)

cout

<" ";

cout

0;}

1182 旅遊航道(tarjan演算法)

旅遊航道 sgoi 旅遊局在 sg iii 星團開設了旅遊業務,每天有數以萬計的地球人來這裡觀光,包括聯合國秘書長,各國 和 sgoi 總局局長等。旅遊線路四通八達,每天都有眾多的載客太空飛船在星團的星球之間來往穿梭,他們保證了任意兩個星球之間總是可以通過航道到達。但是,最近由於財政出現了困難,一些...

演算法 統計排序(桶排序)

看了一道筆試題,說有100w個資料,範圍在0 65535之間,要求用最少的空間和最快的速度進行排序。剛開始的思路是,65535就是2 16,那首先要把資料型別定義為short。其次,要用最少的空間,那最好還是不用遞迴,那不用快排。不遞迴,速度又快,那肯定是堆排序了。o n 的空間 o nlogn 的...

分治演算法 統計數字問題

參考文章 1 1統計數字問題 詳解 步驟一 先求鍵盤輸入的數n是乙個幾位數,設位數為len 公式log n 1 可用cmath裡的函式 double log10 double x 來求解 步驟二 劃分區間,然後相加 把數n盡可能的劃分為較少的區間。按位數劃分 223,可劃分成00 99,100到19...