hdu 4612 求邊連通分量 求樹的直徑

2021-07-11 16:08:15 字數 1393 閱讀 8803

題意:

加一條邊,使得橋的數量最少?

思路:

求邊連通分量,縮點,然後變成乙個樹,樹邊都是橋,求樹的直徑。

樹的直徑就是最多減少的橋。

橋的數量最少就是原圖中的橋的數量 - 樹的直徑。

要注意重邊。

#pragma comment(linker, "/stack:1024000000,1024000000")

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef pair pii;

const

int m_node = 200009, m_edge = 2000009;

int low[m_node],dfn[m_node],belong[m_node],head[m_node];

int dfs_clock,block,bridge,tot;

int n,m,maxlen,s;

bool instack[m_node];

struct node

node[m_edge];

struct edge

edge[m_edge];

vector

g[m_node];

stack

st;

void init()

void add_edge(int u,int v,bool mul)

void tarjan(int u,int fa,bool mul)

}else

if(instack[u] && low[u] > dfn[v]) low[u] = dfn[v];

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

}}void dfs(int u,int pre,int len)

for(int i = 0; i < g[u].size();i++)

}void solve()}}

maxlen = -1;

dfs(1,-1,0);

maxlen = -1;

dfs(s,-1,0);

printf("%d\n",bridge - maxlen);

}bool cmp(node a,node b)

int main()

sort(node,node+m,cmp);

for(int i = 0;i < m;i++)

else}}

solve();

}return

0;}

hdu 4612 強連通分量

題意 有一些小島,這些小島上有一些邊,讓你加一條邊,使得原先的那些邊的橋數最少。做法 1,把小島為點,連線小島的為邊建圖。2,求出圖中的所有強聯通分量 3,把所有的強聯通分量看成乙個點建樹。4,求樹的直徑,新加的那條邊應該在直徑的兩邊,這樣才能使得圖中的橋最小。pragma comment link...

HDU 4612 雙聯通分量 樹的直徑

點選開啟鏈結 題意 給乙個無向聯通圖,裡面可能有重邊,問新增一條邊後,使得圖中的橋最小,將橋的數量輸出 思路 剛剛讀完題,就有了思路去寫,無非就是將聯通圖雙聯通分量後縮點,然後求一條最長的路,首尾相連,肯定將更多的橋包含使得這些橋不再是橋,很好想的題,但是錯了20 什麼鬼,md重邊這麼難處理,醉了 ...

求連通分量

求連通分量 time limit 1000ms memory limit 65536k total submit 233 accepted 132 description 求乙個圖的連通分量 input n 頂點數 100 邊 output 連通分量 sample input 5 1 2 3 4 2...