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 滿足當...