tarjan的教程網上都有
【cogs8】 備用交換機
7 1 2
2 3
2 4
3 4
4 5
4 6
4 7
5 6
6 7輸出檔名:gd.out
2 2
4求割點
#include
#include
#include
#include
#include
using
namespace
std;
struct edge
map[10001];
int n, a, b, root, cnt=0, dep=0, ans=0;
int head[101], low[101], dfn[101];
bool point[101];
void add(int x, int y)
void tarjan(int x)
else low[x] = min(low[x], dfn[map[i].v]);
}}int main()
for(int i=1; i<=n; i++)
if(dfn[i]==0)
printf("%d\n", ans);
for(int i=1; i<=n; i++)
return
0;}
【cogs 618】 傳話
[問題描述]
興趣小組的同學來自各個學校,為了增加友誼,晚會上又進行了乙個傳話遊戲,如果 a 認識 b ,那麼 a 收到某個訊息,就會把這個訊息傳給 b ,以及所有 a 認識的人。
如果 a 認識 b , b 不一定認識 a 。
所有人從 1 到 n 編號,給出所有「認識」關係,問如果 i 發布一條新訊息,那麼會不會經過若干次傳話後,這個訊息傳回給了 i , 1<=i<=n 。
[輸入檔案]
輸入檔案 message.in 中的第一行是兩個數 n(n<1000) 和 m(m<10000) ,兩數之間有乙個空格,表示人數和認識關係數。
接下來的 m 行,每行兩個數 a 和 b ,表示 a 認識 b 。 1<=a, b<=n 。認識關係可能會重複給出,但一行的兩個數不會相同。
[輸出檔案]
輸出檔案 message.out 中一共有 n 行,每行乙個字元 t 或 f 。第 i 行如果是 t ,表示 i 發出一條新訊息會傳回給 i ;如果是 f ,表示 i 發出一條新訊息不會傳回給 i 。
[輸入樣例]
4 6
1 2
2 3
4 1
3 1
1 3
2 3
[輸出樣例]
t t t f
找強連通分量
#include
#include
#include
#include
#include
using
namespace
std;
struct edge
e[200001];
int u, v, t=0, colnum=0;
int n, m, p=0, cnt=0, dep=0;
int head[100001], dfn[100001], low[100001], sta[100001];
int sum[100001], color[100001];
bool insta[100001];
void add(int x, int y)
void tarjan(int x)
else
if(insta[e[i].v]) low[x] = min(low[x], dfn[e[i].v]);
}if(dfn[x]==low[x])
while(sta[p--]!=x);
}}int main()
for(int i=1; i<=n; i++) if(dfn[i]==0) tarjan(i);
for(int i=1; i<=n; i++)
return
0;}
【cogs 921】 [東方s1] 上白澤慧音
題目描述
在幻想鄉,上白澤慧音是以知識淵博聞名的老師。春雪異變導致人間之里的很多道路都被大雪堵塞,使有的學生不能順利地到達慧音所在的村莊。因此慧音決定換乙個能夠聚集最多人數的村莊作為新的教學地點。人間之里由n個村莊(編號為1..n)和m條道路組成,道路分為兩種一種為單向通行的,一種為雙向通行的,分別用1和2來標記。如果存在由村莊a到達村莊b的通路,那麼我們認為可以從村莊a到達村莊b,記為(a,b)。當(a,b)和(b,a)同時滿足時,我們認為a,b是絕對連通的,記為。絕對連通區域是指乙個村莊的集合,在這個集合中任意兩個村莊x,y都滿足。現在你的任務是,找出最大的絕對連通區域,並將這個絕對連通區域的村莊按編號依次輸出。若存在兩個最大的,輸出字典序最小的,比如當存在1,3,4和2,5,6這兩個最大連通區域時,輸出的是1,3,4。
輸入格式
第1行:兩個正整數n,m
第2..m+1行:每行三個正整數a,b,t, t = 1表示存在從村莊a到b的單向道路,t = 2表示村莊a,b之間存在雙向通行的道路。保證每條道路只出現一次。
輸出格式
第1行: 1個整數,表示最大的絕對連通區域包含的村莊個數。
第2行:若干個整數,依次輸出最大的絕對連通區域所包含的村莊編號。
輸入樣例
5 5
1 2 1
1 3 2
2 4 2
5 1 2
3 5 1
輸出樣例
3 1 3 5
資料範圍
對於60%的資料:n <= 200且m <= 10,000
對於100%的資料:n <= 5,000且m <= 50,000
強連通分量
#include
#include
#include
#include
#include
using
namespace
std;
#define maxn 5001
#define maxm 50001
int n, m, x, y, t;
int p=0, cnt=0, dep=0, colornum=0;
int dfn[maxn], low[maxn], sum[maxn];
int head[maxn], stack[maxn], color[maxn];
bool instack[maxn];
struct edge
e[maxm];
void add(int u, int v)
void tarjan(int u)
else
if(instack[v]) low[u] = min(low[u], dfn[v]);
}if(low[u]==dfn[u])
while(u!=stack[p--]);
}}int main()
for(int i=1; i<=n; i++) if(dfn[i]==0) tarjan(i);
int maxs = 0, outcol = 0;
for(int i=1; i<=n; i++)
}printf("%d\n", maxs);
for(int i=1; i<=n; i++) if(color[i]==outcol) printf("%d ", i);
return
0;}
幾道趣味題
1.有乙個隨機數發生器,可以產生1到5的隨機數,利用這個隨機發生器,怎樣產生1到7的隨機數 最直接的想法是拿隨機數乘以7然後除以5,但這樣產生的結果並不是等概率的,7 rand 5中產生不了3和6,因而不可行 正確的做法是5 rand rand 然後捨棄最後4個數,剩餘21個數字。每三個數分為一組,...
幾道演算法題
1 n階乘之和 public class test1 sum kk system.out.println sum 2.獲取二維陣列每列最小的值 public class test2 system.out.println sum public long jiecheng int x return su...
幾道練習題
使用map函式 將字串列表 轉化 lxx.ab 形式 方法一 迭代器形式解題 name lxx lj dsvsf def func item name中的每一項都傳過來 循壞item return item sb name1 map func,name map 函式名,可迭代的 name1是乙個迭代...