Bzoj3562 神器化合物 Shoi 2014

2021-07-09 14:46:14 字數 1280 閱讀 2112

ac通道:

[分析]

若把每乙個原子看作乙個節點,將化學鍵看作一條邊,那麼這個題目要求的「分子的個數」很容易就可以看出是求圖中聯通塊的個數。

求聯通塊的個數,可以使用並查集。可如何求出每一步的聯通塊的個數呢?

可以知道,當連上一條邊時,若此邊連線的是兩個不同的聯通塊,那麼分子個數就會減一;當刪去一條邊時,若刪去這條邊後,它兩邊的邊不連通了,則分子個數就會加一。

如何判斷是否連通呢?可以使用dfs。可是若用裸dfs,則程式會超時。我們可以考慮用並查集將圖中不會被刪除的邊進行縮點,這樣就可以大大減少程式執行的時間。

#include #include #include using namespace std;

struct node;

int head[5010];

node node[400010];

int k[200001][3];

int can[5010][5010];

bool lkan[5100];

int qus[10001][3];

bool vis[5010];

int n,m,ans,cnt=1,tot=0;

int fa[5010];

bool kan[5010][5010];

void add(int x,int y)

inline int find(int x)

return tmp;

}inline void merge(int x,int y)

inline int in()

return ans;

}bool dfs(int now,int r)

if(dfs(node[i].data,r))return true;

} }return false;

}int main()

for(int i=1;i<=n;i++)

} int q;

q=in();

for(int i=1;i<=n;i++)fa[i]=i;

for(int i=1;i<=q;i++)

else

} for(int i=1;i<=m;i++)

} for(int i=1;i<=m;i++)

for(int i=1;i<=q;i++)

} else

can[fx][fy]++;can[fy][fx]++;

if(can[fx][fy]==1)add(fx,fy);

} }return 0;

}

BZOJ1052 BZOJ3760 覆蓋問題

原題位址 先說自己的逗比方法 二分答案,把所有點用乙個最小的矩形 框 起來,易證矩形的其中乙個端點是最優解中正方形的乙個端點,然後列舉四個端點後遞迴處理,差不多了 然後 olz黃學長的o n 做法 ac code include include include using namespace std...

動態點分治 bzoj 3730,bzoj 1095

總結一下動態點分治的模板。對於乙個樹,把它點分的同時記錄每個點的所有父親 logn個 並記錄點距其父親的距離。具體實現就是dfs的時候fa x dep x u,dis x dep x d bzoj1095 您需要寫乙個程式支援反轉點的顏色,求距離最遠的黑色點對的距離。解析 在每個點u存乙個堆st記錄...

福慧雙修 探險 BZOJ4398 BZOJ2407

分析 雙倍經驗 資料範圍不同 我們考慮,我們必定是從1走一條邊到節點i,之後從i到j跑最短路,之後再從j到1走另一條邊的情況下,不會重複,並且是答案。那麼我們考慮預處理出pre i 表示從1走到i滿足最短路的並且經過pre i pre i 為路徑第二個節點。那麼,針對每乙個邊,x,y,z,v 滿足當...