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 61 22 3
3 44 1
2 55 2
1 00
1 2 3 4 5對於40%的資料,有n<=200。1
對於100%的資料,有n<=5000,m<=50000。
/*view codetarjan演算法
題目要求求出的點滿足它能連到的點也能連回來,那麼就一定要與它在同一縮點中,如果乙個縮點出度大於1,那麼這個縮點中的所有點都不滿足要求。
*/#include
#include
#include
#include
#define m 5010
using
namespace
std;
int num[m],low[m],instack[m],vis[m],belong[m],out
[m],a[m][m],s
[m*2
],cnt,indexx,top;
inthead[m],n,m,ans[m];
struct
node
;node e[m*10
];int
read()
while(c>='
0'&&c<='9')
return num*flag;
}void add(int i,int x,int
y)void tarjan(int
v)
else
if(instack[w])
low[v]=min(low[v],num[w]);
}intu;
if(num[v]==low[v])
while(u!=v);
}}void
work()
for(int i=1;i<=n;i++)
if(!vis[i])tarjan(i);
for(int i=1;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=0
;
for(int i=1;i<=cnt;i++)if(!out
[i])
for(int j=1;j<=a[i][0];j++)
ans[++k]=a[i][j];
sort(ans+1,ans+k+1
);
for(int i=1;i<=k;i++)
printf(
"%d
",ans[i]);
printf("\n
");}int
main()
return0;
}
旅遊電車(tarjan演算法 統計出度)
問題描述 henryy國正致力於首都的乙個旅遊電車建設工程。首都有n個旅遊景區。henryy國的電車永遠只沿道路規定的方向行駛,為了不使投入使用的電車有可能無法回到它的起始站,henryy希望知道他的首都的可以在哪些景區設定站點。乙個景區可以被設定成車站,當且僅當對於任意乙個從該景區出發所能到達的景...
COGS 0011 運輸問題1
輸入檔案 maxflowa.in輸出檔案 maxflowa.out簡單對比 時間限制 1 s 記憶體限制 128 mb 問題描述 乙個工廠每天生產若干商品,需運輸到銷售部門進行銷售。從產地到銷地要經過某些城鎮,有不同的路線可以行走,每條兩城鎮間的公路都有一定的流量限制。請你計算,在不考慮其它車輛使用...
COGS 11 運輸問題1
輸入檔案 maxflowa.in輸出檔案 maxflowa.out簡單對比 時間限制 1 s 記憶體限制 128 mb 問題描述 乙個工廠每天生產若干商品,需運輸到銷售部門進行銷售。從產地到銷地要經過某些城鎮,有不同的路線可以行走,每條兩城鎮間的公路都有一定的流量限制。請你計算,在不考慮其它車輛使用...