題意:
加一條邊,使得橋的數量最少?
思路:
求邊連通分量,縮點,然後變成乙個樹,樹邊都是橋,求樹的直徑。
樹的直徑就是最多減少的橋。
橋的數量最少就是原圖中的橋的數量 - 樹的直徑。
要注意重邊。
#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...