HDU 5739 點 雙聯通分量

2021-07-16 12:02:16 字數 1385 閱讀 4075

官方題解其實說的很好的……

只不過我沒弄明白連通分量的內在含義。弄明白以後,用劉汝佳大白書的模板即可。

這道題涉及逆元,因為讀入的資料都比1e9小,所以直接用費馬小定理的方法求逆元比較方便。

2個點,也算乙個點連通分量。

1個點孤立的,在劉汝佳的模板中,不算連通分量,並且被記為屬於0號連通快(其他正常連通塊,都是編號從1開始往後一直到bcccnt的)。

然後,寫之前想了好多……後來還是模仿某個菊苣的寫法啦。

這張圖看了好多遍不明白為啥1,2是乙個連通分量……實際上應該是乙個連通分量。

小技巧:對於求的點,為新的圖的根的話,要考慮情況,所以在建樹的時候,直接用新增的虛點為根,就比較穩了~程式也少一些東西。

#include #include #include #include #include using namespace std;

typedef long long ll;

const int maxn = 300000 + 10;

const ll mod = 1e9 + 7;

int n , m;

struct edge ;

int pre[maxn], iscut[maxn], bccno[maxn], dfsclock, bcccnt; // bccno[i]表示i屬於哪乙個bcc,割頂的bccno無意義

vectorg[maxn], bcc[maxn];//bcc[i]儲存每個分量的點

stacks;

int dfs(int u, int fa);

void findbcc(int n)

}ll w[maxn];

bool vis[maxn];

void init()

while (m--) }

ll powmod( ll a , ll b , ll p = mod)//a^b % p

return r ;

}

vectorg[maxn];

ll sum[maxn], mul[maxn];

int belong[maxn];

#define prln(x) cout<

if (bccno[x.v] != bcccnt)

if (x.u == u && x.v == v) break;}}

continue;

} if (pre[v] < pre[u] && v != fa)

} if (fa < 0 && child == 1) iscut[u] = 0;

return lowu;

}

HDU 4738 雙聯通分量

點選開啟鏈結 題意 給出乙個無向圖和每條邊的權值,現在破壞一條路使得圖不再聯通,只能破壞一條路,問最少需要的花費,花費為邊上的權值,注意的是,圖剛開始可能不連通,輸出1 花費最小的邊為0輸出1,其他沒什麼了 思路 求橋的模版題,在找到乙個橋時更新費用最小,對了還有乙個可能有重邊,簡單 include...

點 邊 雙聯通分量1 1

點 include include include include include includeusing namespace std const int maxn 1000 10 int n,m int bcc cnt int dfs clock bcc cnt計數一共有多少個點 雙連通分量 i...

邊雙聯通分量

首先什麼是邊雙聯通分量?邊雙連通分量是指,在 無向圖 中刪除任意一條邊依舊聯通的聯通塊 之前講過強連通分量,這裡邊雙聯通分量的做法也需要利用tarjan演算法獲得邊雙聯通分量。對於邊雙聯通分量中還有乙個概念,就是橋。橋指的是 刪除該邊圖不再連通。對應的另乙個概念是 割點 割點的的是 如果除去此節點和...