題目大意:求乙個連通圖然後加一條邊使得橋的數目最少
題解思路:先把橋兩邊不是的點所有連通的點都縮成乙個點;
然後把縮完的點構成一顆樹那麼再直徑的兩端加一條邊就是最優方案
注意:判斷重邊
題目鏈結
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int mx = 2e5+10;
#pragma comment(linker,"/stack:1024000000,1024000000") //擴大棧的容量
stack
s;bool vis[mx];
int dis[mx];
vector
g1[mx],g2[mx];
int pre[mx],low[mx],sccno[mx];
int dfn,cnt,bri,n,m;
int last_node,maxs;
void init()
}void dfs(int u,int fa)
else
if(v != fa || flag)
low[u] = min(low[v],low[u]);
if(v == fa) //判讀之前是否有重邊
flag = 1;
}if(pre[u] == low[u])
}}void bfs(int s)
q.push(v);}}
}}void solve()
}bfs(1); //先從任意點遍歷最長的節點
bfs(last_node); //然後遍歷回去求最長路徑就是樹的直徑
printf("%d\n",bri-maxs);
}int main()
solve();
}return
0;}
HDU 4612 雙聯通分量 樹的直徑
點選開啟鏈結 題意 給乙個無向聯通圖,裡面可能有重邊,問新增一條邊後,使得圖中的橋最小,將橋的數量輸出 思路 剛剛讀完題,就有了思路去寫,無非就是將聯通圖雙聯通分量後縮點,然後求一條最長的路,首尾相連,肯定將更多的橋包含使得這些橋不再是橋,很好想的題,但是錯了20 什麼鬼,md重邊這麼難處理,醉了 ...
hdu 4612 求邊連通分量 求樹的直徑
題意 加一條邊,使得橋的數量最少?思路 求邊連通分量,縮點,然後變成乙個樹,樹邊都是橋,求樹的直徑。樹的直徑就是最多減少的橋。橋的數量最少就是原圖中的橋的數量 樹的直徑。要注意重邊。pragma comment linker,stack 1024000000,1024000000 include i...
HDU4612 Tarjan縮點 BFS求樹的直徑
tarjan 縮點 樹的直徑 題意 給出n個點和m條邊的圖,存在重邊,問加一條邊以後,剩下的橋的數量最少為多少。先tarjan縮點,再在這棵樹上求直徑。加的邊即是連線這條直徑的兩端。1 2 tarjan 縮點 樹的直徑 3題意 給出n個點和m條邊的圖,存在重邊,問加一條邊以後,剩下的橋的數量最少為多...