zoj 1967 Fiber Network
2013-08-15 10:43
134 查看
题目大意是一张地图中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 ]。
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; }
相关文章推荐
- zoj 1967 Fiber Network
- zoj 1967 && poj 2570 Fiber Network
- zoj 1967 Fiber Network(位运算&&FLOYD)
- Poj 1967 &&Zoj 2183 Alibaba
- ZOJ 1967 POJ 2570 Fiber Network
- Poj 1967 &&Zoj 2183 Alibaba
- zoj 1967 Fiber Network/poj 2570
- zoj 1530 记忆化搜索
- zoj 1203 Swordfish
- ZOJ 3896 Permutation (JAVA IO, CRT)
- ZOJ 2432 Greatest Common Increasing Subsequence——dp
- zoj1403
- ZOJ 2771
- ZOJ.2829 Beautiful Number【水】 2015/09/22
- ZOJ Problem Set - 1001
- zoj 3519 Beautiful People
- ZOJ-1130
- ZOJ 2369 | SGU 217 | Acdream 1234 自适应辛普森积分
- zoj 4019(2018浙大赛 F.Schrödinger's Knapsack)
- ZOJ 1649 - Rescue BFS/优先队列