hdu 1181 floyd求有向图传递闭包

//floyd求有向图传递闭包
/*传递闭包-----所谓传递性,可以这样理解:对于一个节点i,如果j能到i,i能到k,那么j就能到k。求传递闭包,就是把图中所有满足这样传递性的节点都弄出来,计算完成后,我们也就知道任意两个节点之间是否相连。
传递闭包的计算过程一般可以用Warshell算法描述:
For 每个节点i Do
    For 每个节点j Do
    If j能到i Then
        For 每个节点k Do
        a[j, k] := a[j, k] Or ( a[j, i] And a[ i, k] )
其中a数组为布尔数组,用来描述两个节点是否相连,可以看做一个无权图的邻接矩阵。可以看到,算法过程跟Floyd很相似,三重循环,枚举每个中间节点。只不过传递闭包只需要求出两个节点是否相连,而不用求其间的最短路径长。*/


#include <iostream> #include <cmath> #include <cstring> using namespace std; int map[200][200]; void floyd() { for(int i='a'; i<='z'; i++) { for(int j='a'; j<='z'; j++) { if(map[i][j]) //如果i->j { for(int k='a'; k<='z'; k++) { if(map[k][i]) //并且k->i { map[k][j] = 1; //那么k->j } } } } } } int main() { char str[100]; memset(map,0,sizeof(map)); while(cin>>str) { if(strcmp(str,"0") == 0) { floyd(); if(map['b']['m'] == 1) { cout<<"Yes."<<endl; } else { cout<<"No."<<endl; } memset(map,0,sizeof(map)); } else { int len = strlen(str); map[str[0]][str[len-1]] = 1; } } return 0; }

你可能感兴趣的:(算法)