官方題解其實說的很好的……
只不過我沒弄明白連通分量的內在含義。弄明白以後,用劉汝佳大白書的模板即可。
這道題涉及逆元,因為讀入的資料都比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演算法獲得邊雙聯通分量。對於邊雙聯通分量中還有乙個概念,就是橋。橋指的是 刪除該邊圖不再連通。對應的另乙個概念是 割點 割點的的是 如果除去此節點和...