1. 程式人生 > >hdu 4496 並查集 反向並查集 水題 D-City

hdu 4496 並查集 反向並查集 水題 D-City

ssi fat include connected fin lines bottom printf conn

覺得這道題以後可以和優先隊列結合起來 嗯

就是說依次去掉前n條路求連通塊數量

處理的時候 只要每次merge發現父親不相等 然後進到裏面合並的時候 num--

wa了好幾次是因為最後輸出的時候開了點的數量大小的數組而不是操作數量數組 orz

D-City

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 5334 Accepted Submission(s): 1864


Problem Description Luxer is a really bad guy. He destroys everything he met.
One day Luxer went to D-city. D-city has N D-points and M D-lines. Each D-line connects exactly two D-points. Luxer will destroy all the D-lines. The mayor of D-city wants to know how many connected blocks of D-city left after Luxer destroying the first K D-lines in the input.
Two points are in the same connected blocks if and only if they connect to each other directly or indirectly.

Input First line of the input contains two integers N and M.
Then following M lines each containing 2 space-separated integers u and v, which denotes an D-line.
Constraints:
0 < N <= 10000
0 < M <= 100000
0 <= u, v < N.

Output Output M lines, the ith line is the answer after deleting the first i edges in the input.

Sample Input 5 10 0 1 1 2 1 3 1 4 0 2 2 3 0 4 0 3 3 4 2 4

Sample Output 1 1 1 2 2 2 2 3 4 5 Hint The graph given in sample input is a complete graph, that each pair of vertex has an edge connecting them, so there‘s only 1 connected block at first. The first 3 lines of output are 1s because after deleting the first 3 edges of the graph, all vertexes still connected together. But after deleting the first 4 edges of the graph, vertex 1 will be disconnected with other vertex, and it became an independent connected block. Continue deleting edges the disconnected blocks increased and finally it will became the number of vertex, so the last output should always be N.
#include<iostream>
#include
<cmath> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 10000; const int MAXM = 100000; int father[MAXN + 100]; int u[MAXM + 100]; int v[MAXM + 100]; int ans[MAXM + 100]; int n,m,num; void initt(){ for(int i = 0;i < n;i++){ father[i] = i; } return; } int findd(int u){ if(father[u] == u) return father[u]; father[u] = findd(father[u]); return father[u]; } void mergee(int u,int v){ int fatu = findd(u); int fatv = findd(v); if(fatu != fatv){ num--; father[fatu] = fatv; } } int main(){ while(~scanf("%d%d",&n,&m)){ //initt(); for(int i = 0;i < n;i++){ father[i] = i; } for(int i = 0;i < m;i++){ scanf("%d%d",u+i,v+i); } num = n; for(int i = m-1;i >= 1;i--){ mergee(u[i],v[i]); ans[i] = num; } ans[m] = n; for(int i = 1;i <= m;i++){ printf("%d\n",ans[i]); } } return 0; }

hdu 4496 並查集 反向並查集 水題 D-City