最近的任务是最短路,白书上的内容勉强能懂,一到做题就完了蛋了。这毕竟是具体的算法,不像DP只是思想,没有基础真的不行,于是学长让我先做并查集,再看树,再学图论……
说到并查集,有篇很经典的文章http://apps.hi.baidu.com/share/detail/15881874,要是讲算法的文章都是这种风格,那世界就太美好了。
代码如下:
1 #include<stdio.h> 2 int boss[10000010]; 3 int n,m; 4 int find(int a) 5 { 6 int i,j,r; 7 r = i = a; 8 while(boss[r] != r) 9 r = boss[r]; 10 while(i != r) 11 { 12 j = boss[i]; 13 boss[i] = r; 14 i = j; 15 } 16 return r; 17 } 18 int main() 19 { 20 int i,t1,t2,b1,b2,ans; 21 while(~scanf("%d%d",&n,&m)) 22 { 23 for(i = 1; i <= m; i++) 24 boss[i] = i; 25 ans = 0; 26 for(i = 0; i < n; i++) 27 { 28 scanf("%d%d",&t1,&t2); 29 b1 = find(t1); 30 b2 = find(t2); 31 if(b1 != b2) 32 boss[b2] = b1; 33 } 34 int t = find(1); 35 for(i = 2; i <= m; i++) 36 if(find(i) == t) 37 ans++; 38 printf("%d\n",ans); 39 } 40 return 0; 41 }