给出n个点和m条边,一条一条地删除边,问每次删除以后有多少个联通块。
分析:其实就是并查集的应用,只是前一阵子一直做图论思路一直囿于tarjan了。。方法就是,记录每一条边,然后从最后一条边开始不断的加边,如果用并查集来判断联通块有没有减少即可。
代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <set> 5 using namespace std; 6 typedef pair<int,int> pii; 7 8 int root[10000+5],ans[10000+5]; 9 pii edges[100000+5]; 10 int findroot(int x) {return x==root[x]?x:root[x]=findroot(root[x]);} 11 12 int main() 13 { 14 int n,m; 15 while(scanf("%d%d",&n,&m)==2) 16 { 17 int sum = n; 18 for(int i=0;i<n;i++) root[i]=i; 19 for(int i=0;i<m;i++) 20 { 21 int u,v; 22 scanf("%d%d",&u,&v); 23 edges[i]=pii(u,v); 24 } 25 26 for(int i=m-1;i>=0;i--) 27 { 28 ans[i] = sum; 29 int u = edges[i].first,v=edges[i].second; 30 int x = findroot(u),y = findroot(v); 31 if(x != y) 32 { 33 root[x] = y; 34 sum --; 35 } 36 } 37 for(int i=0;i<m;i++) 38 { 39 printf("%d\n",ans[i]); 40 } 41 } 42 return 0; 43 }
时间: 2024-10-15 05:42:23