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( "\n" );
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]!=‘\0‘ ; 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( "\n" ); // 输出格式要求
77 }
78 return 0;
79 }

today:

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

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

时间: 2024-10-10 16:46:30

TOJ---1141---warShall传递闭包的相关文章

Warshall 传递闭包算法

从第i个顶点开始,无论采取哪种遍历方法,都能得到通过第i个顶点访问到的所有顶点的信息,传递闭包第i行相应的列设为1: #include<iostream> using namespace std; void warshall(int a[][4],int n) { for (int k = 0; k < n; k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) a[i][j]=a[i][j]||(a[i][k]&a[k][j]

有向图传递闭包

目录 传递闭包的定义 Floyd warshall 传递闭包算法 Floyd warshall 代码 算法实现原理 Floyd warshall 传递闭包算法的实现 时间复杂度 DFS 传递闭包算法 算法分析 代码实现 例题 有向图的传递闭包是Floyd warshall 算法的一种应用(主要参考算法导论) 传递闭包的定义 对于有向图G(V,E)的传递闭包即是G(V,E),其中E{(i,j):图G中包含一条由i到j的路径}. Floyd warshall 传递闭包算法 Floyd warshal

Warshall算法求传递闭包

传递闭包 在数学中,在集合 X 上的二元关系 R 的传递闭包是包含 R 的 X 上的最小的传递关系. 例如,如果 X 是(生或死)人的集合而 R 是关系“为父子”,则 R 的传递闭包是关系“x 是 y 的祖先”.再比如,如果 X 是空港的集合而关系 xRy 为“从空港 x 到空港 y 有直航”,则 R 的传递闭包是“可能经一次或多次航行从 x 飞到 y”. Warshall算法 Warshall在1962年提出了一个求关系的传递闭包的有效算法.其具体过程如下,设在n个元素的有限集上关系R的关系矩

求传递闭包的warshall算法

———————————————————————————— Question:R是定义于集合S上的二元关系,求R的传递闭包. Input:relation R,set A Output:t(R),which is the transitive closure of R  Solution:Warshall algorithm ———————————————————————————— 传递闭包(transitive closure) R* = R1 ∪ R2 ∪ R3 ∪ ...... ∪ Rn  

Bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 传递闭包,bitset

1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 323  Solved: 238[Submit][Status][Discuss] Description 农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序.    约翰已经比较了M(1≤M≤10000)对奶牛的产奶率,但他发现,他还需要再做一

Warshall算法

---用Warshall算法解决传递闭包问题 ---在一个关系R中,如果任意的(a,b)和(b,c)在关系R中,则(a,c)也一定在关系R中,则称R是可传递的.一个关系R的传递闭包是包 含R的最小的传递关系. ---Warshall算法不用来计算最短路径,而是用来判断i和j之间是否单向连接,无论是直接连接还是间接连接 ---初始条件不再是邻接矩阵,而是关系矩阵,如果两个点之间直接单向连接,那么在矩阵中对应的值就为1,反之为0 ---根据已有的直接连接关系得出其它所有的间接连接关系,即判断两点之间

UVa 247 (传递闭包) Calling Circles

题意: 有n个人m通电话,如果有两个人相互打电话(直接或间接)则在同一个电话圈里.输出所有电话圈的人的名单. 分析: 根据打电话的关系,可以建一个有向图,然后用Warshall算法求传递闭包. 最后输出是辅助一个标记数组,用DFS输出的,这个办法挺巧妙的. 本来我原来的想法是,用并查集求所有的连通分量,然后再好多次循环找连通分量一致的名字输出,那样太麻烦了. ios::sync_with_stdio(false);这个最好不要随便用,可能会产生某些副作用. 字符指针是可以传给string对象作参

poj 1141 区间dp

题目链接:http://poj.org/problem?id=1141 题解:略 代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define ll long long const int maxn=1e2+5; const int INF=0x3f3f3f3f; int dp[105][105]; int

poj 1975 Median Weight Bead(传递闭包 Floyd)

链接:poj 1975 题意:n个珠子,给定它们之间的重量关系,按重量排序,求确定肯定不排在中间的珠子的个数 分析:因为n为奇数,中间为(n+1)/2,对于某个珠子,若有至少有(n+1)/2个珠子比它重或轻,则它肯定不排在中间 可以将能不能确定的权值初始化为0,能确定重量关系的权值设为1 #include<stdio.h> #include<string.h> int a[110][110]; int main() { int T,n,m,i,j,k,d,x,sum; scanf(