藍橋杯 歷屆試題(只有40分,強聯通求割點個數)

2021-09-16 12:03:17 字數 1947 閱讀 3661

//在網上看了看其他人的題解,有拿並查集判斷去除某個點後兩個是否屬於同一棵樹的,有用dfs判斷從某點到某點的方法有幾個,順便記錄路上經過點,到達則每個點經過次數加一,最後判斷方法和次數是否一致,一致則說明為必經dian ,....也可以用深搜和廣搜判斷去除某一點後,是否還能抵達.....

我看了看   好像屬於割點,可以用tarjan做......然後  在網上找了個關於強聯通的模板(poj1236).....求得是所有點組成的圖的割點,,,,所以,解法還是和dfs或者bfs差不多,,都是去除某個點,然後判斷是否屬於同乙個陣列裡......

但是  應該還是有問題,,只有40分....待解決.............

的博文也用了tarjan.....模板都是一樣的,不過他新建了乙個陣列endishere,用來標記起點到終點的割點...標記方法在我看來是十分巧妙的...即不斷往下搜尋...直到終點,然後標記終點的的上個點,回溯即可將改路徑上走過的點標記..之後判斷1-n這n個點,被標記並且是割點即可....

模板應該如下..(能不能過..我沒試過...等想寫了改下提交試試)

//判斷是否為割點

void findcutnode(int dep, int u)

}else if(parent[u] != v && dfn[v] < low[u])//v的父節點不能用來跟新他的low值 } }

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

}}

//強聯通求割邊和割點的問題 

#include #include#include #define v 105

#define e 100500

const int inf = 0x3f3f3f;

using namespace std;

struct edge

edge[e];

int head[v], e, n, m;

int indeg[v], outdeg[v]; //點的入度和出度數

int belong[v], low[v], dfn[v], scc, cnt;//dfn:遍歷到u點的時間; low:u點可到達的各點中最小的dfn[v]

int s[v], top;

bool vis[v];//v是否在棧中

bool cut[v];

int addedge(int u, int v)

//int cont = 0;

void tarjan(int u)

*/low[u] = low[u] < low[v] ? low[u] : low[v];//回溯保證low為所聯絡的最小值

}else if (vis[v] && low[u] > dfn[v])//v在棧中,修改low[u]

low[u] = dfn[v];

}if (dfn[u] == low[u])//u為該強連通分量中遍歷所成樹的根

while (u != v);

}}int solve(int i)

void count_deg()

}}int main()

int l, r;

cin >> l >> r;

int cutn = 0;

//將i點去除後,判斷l與r是否在同乙個樹里...若不在則為割點

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

/* count_deg();

int inc = 0, outc = 0;

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

printf("%d\n%d\n", inc, (inc > outc ? inc : outc));*/}}

if(cutn == 0)

cout << -1 << endl;

else

cout << cutn <}

return 0;

}

藍橋杯試題 歷屆試題 分糖果

問題描述 有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲 每個小朋友都把自己的糖果分一半給左手邊的孩子。一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。反覆進行這個遊戲,直到所有小朋友的糖果數都相同為止。你的任務是 在已知的初始糖果情形下,老師一共需要補...

藍橋杯 歷屆試題 分糖果

歷屆試題 分糖果 時間限制 1.0s 記憶體限制 256.0mb 問題描述 有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲 每個小朋友都把自己的糖果分一半給左手邊的孩子。一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。反覆進行這個遊戲,直到所有小朋友的糖...

藍橋杯 歷屆試題 分糖果

歷屆試題 分糖果 時間限制 1.0s 記憶體限制 256.0mb 問題描述 有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲 每個小朋友都把自己的糖果分一半給左手邊的孩子。一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。反覆進行這個遊戲,直到所有小朋友的糖...