問題描述:
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...