M.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. /* wuxiangtugediangebian */
  7. const int MAXN = 1010;
  8. const int WHITE = 0,GREY = 1,BLACK = 2;
  9. int map[MAXN][MAXN];
  10. int DFN[MAXN],low[MAXN],col[MAXN];
  11. int target[MAXN];
  12. int n,ans;
  13. void tarjan(int now, int father, int depth){
  14. DFN[now] = depth;
  15. col[now] = GREY;
  16. int child = 0;
  17. ans = 0;
  18. for(int i = 1; i <= n; i++){
  19. if(map[now][i] == 0)continue;
  20. if( i != father && col[i] == GREY){// i is u'grandfather
  21. low[now] = min(low[now],DFN[i]);
  22. }
  23. if(col[i] == WHITE ){// i is u'child
  24. tarjan(i,now,depth+1);
  25. child++;
  26. low[now] = min(low[i],low[now]);
  27. if((now == 1 && child > 1) || (now != 1 && low[i] >= DFN[now])){//is ge dian
  28. target[now] ++;
  29. //ans++; //注意:需要记录该割点增加几个联通分量的操作需要在这里ans++
  30. }
  31. /*
  32. if(low[i] > DEN[now]){
  33. target[now][i] = 1;//now->i is ge edge;
  34. }
  35. */
  36. }
  37. }
  38. col[now] = BLACK;
  39. }
  40. int main(){
  41. int T= 0;
  42. int x,y;
  43. while(scanf("%d",&x)&&x){
  44. memset(map,0,sizeof(map));
  45. memset(col,0,sizeof(col));
  46. memset(target,0,sizeof(target));
  47. for(int i = 1; i <= MAXN; i++){
  48. low[i] = 99999999;//low[i] should initilized INT_MAX;
  49. }
  50. n = max(n,x);
  51. scanf("%d",&y);
  52. n = max(n,y);
  53. map[x][y] = map[y][x] = 1;
  54. while(scanf("%d",&x)&&x){
  55. n = max(n,x);
  56. scanf("%d",&y);
  57. n = max(n,y);
  58. map[x][y] = map[y][x] = 1;
  59. }
  60. printf("Network #%d\n",++T);
  61. tarjan(1,1,0);
  62. int cnt = 0;
  63. for(int i = 1; i <= n; i++){
  64. if(target[i]) {
  65. cnt++;
  66. }
  67. }
  68. if(cnt == 0){
  69. printf(" No SPF nodes\n");
  70. }
  71. else{
  72. for(int i = 1; i <= n; i++){
  73. if(target[i]) {
  74. printf(" SPF node %d leaves %d subnets\n",i,target[i]+1);
  75. }
  76. }
  77. }
  78. cout<<endl;
  79. }
  80. }