05-树8 File Transfer

Posted wgxi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了05-树8 File Transfer相关的知识,希望对你有一定的参考价值。

  课上例题。

  这题考查对并查集的运用以及对之前并查算法的优化。

  1 #include <stdio.h>
  2 
  3 #define MAXN 10000                    /* 集合最大元素个数 */
  4 
  5 typedef int ElementType;            
  6 typedef ElementType SetName;        /* 默认用根节点的下标作为结点名称 */
  7 typedef ElementType SetType[MAXN];    /* 假设集合元素下标从 0 开始 */
  8 
  9 void Initialization(SetType S, int N);
 10 SetName Find(SetType S, ElementType X);
 11 void Union(SetType S, SetName Root1, SetName Root2);
 12 void Input_connection(SetType S);
 13 void Check_connection(SetType S);
 14 void Check_netWork(SetType S, int N);
 15 
 16 int main()
 17 {
 18     SetType S;
 19     int N;
 20     char in;
 21     scanf("%d
", &N);
 22     Initialization( S, N );
 23     
 24     do {
 25         scanf("%c", &in);
 26         switch ( in ) {
 27             case I:    Input_connection( S );    break;
 28             case C:    Check_connection( S );    break;
 29             case S:    Check_netWork( S, N );    break;
 30         }
 31     } while ( in != S );
 32     
 33     return 0;
 34 }
 35 
 36 void Input_connection(SetType S)
 37 {
 38     ElementType x1, x2;
 39     SetName Root1, Root2;
 40     
 41     scanf("%d %d
", &x1, &x2);
 42     Root1 = Find(S, x1-1);
 43     Root2 = Find(S, x2-1);
 44     
 45      if ( Root1 != Root2 )
 46          Union(S, Root1, Root2);
 47 }
 48 
 49 void Check_connection(SetType S)
 50 {    /* 检查 是否 连通 */
 51     ElementType x1, x2;
 52     SetName Root1, Root2;
 53     
 54     scanf("%d %d
", &x1, &x2);
 55     Root1 = Find(S, x1-1);
 56     Root2 = Find(S, x2-1);
 57     
 58     if ( Root1 == Root2 ) printf("yes
");
 59     else                   printf("no
");
 60     
 61 }
 62 
 63 void Check_netWork(SetType S, int N)
 64 {    /* 检查 连通性 */
 65     int i, cnt = 0;
 66     
 67     for ( i = 0; i < N; i++ ) {
 68         if ( S[i] < 0 )        cnt++; 
 69     }    
 70     
 71     if ( cnt == 1 )
 72         printf("The network is connected.
");
 73     else 
 74         printf("There are %d components.
", cnt);
 75 }
 76 
 77 void Union(SetType S, SetName Root1, SetName Root2)
 78 {
 79     /* 保证 小集合 并入 大集合 */
 80     if ( S[Root1] < S[Root2] ) { /* 如果 Root1 规模大 */
 81         S[Root1] += S[Root2];
 82         S[Root2] = Root1;         /* Root2 并入 Root1 */ 
 83     }
 84     else {                         /* 如果 Root2 规模大 */
 85         S[Root2] += S[Root1];
 86         S[Root1] = Root2;         /* Root1 并入 Root2 */ 
 87     }
 88 }
 89 
 90 SetName Find(SetType S, ElementType X)
 91 {
 92     if ( S[X] < 0 )  /* 找到集合的根 */ 
 93         return X;
 94     else
 95         return S[X] = Find(S, S[X]); /* 路径压缩 */ 
 96 }
 97 
 98 void Initialization(SetType S, int N)
 99 {    /* 集合元素全部初始化为 -1 */ 
100     int i;
101     for ( i = 0; i < N; i++ ) 
102         S[i] = -1;
103 }

  不得不说,这里的 switch 语句用的太漂亮了,赞。

以上是关于05-树8 File Transfer的主要内容,如果未能解决你的问题,请参考以下文章

05-树8 File Transfer

数据结构1 - 05-树8 File Transfer

数据结构树 —— 编程作业 10 :File Transfer

PAT 5-8 File Transfer (25分)

智能合约实战 solidity 语法学习 05 [ for循环transfer ] 附代码

pta 编程题13 File Transfer