• TOJ---1141---warShall传递闭包


    好多事.....

    特别是心事....

    总是爱追忆自己亲手丢掉的东西.....

    -------------------华丽丽的分界线---------------------

    好 现在来看这个题目吧:

        touch me

    当时  题目是读懂了 就是纠结在 字符串的存储与读取上 然后就这样被卡主了...

    后来 参考了下面2篇 博客  帮助很大 写的很好

    http://blog.csdn.net/classicbear/article/details/7608410

    http://www.cnblogs.com/jackge/archive/2013/05/01/3053285.html

    给我感觉就是 位运算 真的很有用 有必要好好掌握一下  and 将字母进行 移位运算 这个hash 非常好

    虽然 这个下面代码很水 但给出的注释i 可能有助于你的理解

     1 // warShall 传递闭包
     2 
     3 #include <iostream>
     4 #include <map>
     5 using namespace std;
     6 
     7 const int size = 220;
     8 char str[size];
     9 int mp[size][size];
    10 
    11 void warShall( int n )
    12 {
    13     for( int k = 1 ; k<=n ; k++ )
    14     {
    15         for( int i = 1 ; i<=n ; i++ )
    16         {
    17             for( int j = 1 ; j<=n ; j++ )
    18             {
    19                 if( mp[i][k]&mp[k][j] ) // 只有 2个二进制在某位上都是1 值在该位上才是1 可以判断段 i->k  与  k->j 是否有相同的顶点即 作为 i->j的桥梁
    20                 {
    21                     mp[i][j] = mp[i][j] | ( mp[i][k]&mp[k][j] ); // 存在一个k是i->j的桥梁 则将其加入 i->j的可以到达的方式中 以位运算结果存储
    22                 }
    23             }
    24         }
    25     }
    26 }
    27 
    28 void slove( int value )
    29 {
    30     int cnt = 0;
    31     if( value )
    32     {
    33         while( value )
    34         {
    35             if( value&1 ) // 从低至高 一位一位进行判断 即a~z的判断 &1就是判断最低位1 是否为1 即可以判断是否有字幕存在 即是否可以连接
    36             {
    37                 printf( "%c",'a'+cnt );
    38             }
    39             value>>=1; // &1 了 就右移一位 最低位的1被舍弃
    40             cnt++;
    41         }
    42     }
    43     else
    44     {
    45         printf( "-" );
    46     }
    47     printf( "
    " );
    48 }
    49 
    50 int main()
    51 {
    52     int n;
    53     int st , end;
    54     while( ~scanf("%d",&n) &&n )
    55     {
    56         memset( mp , 0 , sizeof(mp) );
    57         while(1)
    58         {
    59             scanf( "%d %d",&st,&end );
    60             if( !st && !end )
    61                 break;
    62             scanf( "%s",str );
    63             for( int i = 0 ; str[i]!='' ; i++ )
    64             {
    65                 mp[st][end] = mp[st][end] | ( 1<<(str[i]-'a') ); // 或 运算 任何一个二进制中的某位上是1 则 值在该位上也是1
    66             }
    67         }
    68         warShall( n );
    69         while(1)
    70         {
    71             scanf( "%d %d",&st,&end );
    72             if( !st && !end )
    73                 break;
    74             slove( mp[st][end] );
    75         }
    76         printf( "
    " ); // 输出格式要求
    77     }
    78     return 0;
    79 }
    View Code

    today:

      世间每一次相逢都是久别重逢

    just follow your heart
  • 相关阅读:
    Python中的装饰器之@wraps(四)
    python中装饰器之有参装饰器(三)
    python中装饰器之叠加装饰器(二)
    python中装饰器之闭包函数(一)
    python中的命名空间
    函数的嵌套与迭代
    函数对象
    matlab学习checkbox使用
    matlab学习滚动条改变文本数值
    matlab学习GUI可调的界面窗口
  • 原文地址:https://www.cnblogs.com/radical/p/3778932.html
Copyright © 2020-2023  润新知