zoj 1967 Fiber Network
题目大意是一张地图中n个公司建立一些点间的线路,对每次查询A,B,输出A,B间可通过哪些公司的线路连接。
floyd变形,m[ i ][ j ]表示 i 到 j 间可以通过的公司的线路,对于公司的表示利用位运算,每个小写字母代表一个公司,所以不超过26位,如000.....00101代表公司a和c,0000....111代表公司a,b,c,则方程为m[ i ][ j ]|=m[ i ][ k ]&m[ k ][ j ]。
#include <stdio.h> #include <string.h> int main() { int m[300][300],n,A,B; int i,j,k; char str[30],ch; while(1) { memset(m,0,sizeof(m)); scanf("%d",&n); if(n==0) break; while(1) { scanf("%d%d",&A,&B); if(A==0&&B==0) break; getchar(); scanf("%s",str); for(i=0;str[i];i++) m[A][B]|=1<<(str[i]-'a'); //位运算表示公司集合 } for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) m[i][j]|=(m[i][k]&m[k][j]); while(1) { scanf("%d%d",&A,&B); if(A==0&&B==0) break; for(ch='a';ch<='z';ch++) { if(m[A][B]&(1<<(ch-'a'))) printf("%c",ch); } if(!m[A][B]) printf("-"); printf("\n"); } printf("\n"); } return 0; }