POJ 2570 Fiber Network
2010-10-29 19:51
253 查看
我觉得是一道不错的题目,题目不难,但是考验基本功
无非是用Floyd传递闭包,但由于数据量比较大,一开始用的暴力方法储存公司标记(是字符,不是字符串),结果超时了
后来看了DISCUSS,说用位运算,茅塞顿开
还有读取数据的时候用字符读,要小心空格!
位运算是个好东西啊,对于表示有或无,求交和并很方便,且速度快
代码:
无非是用Floyd传递闭包,但由于数据量比较大,一开始用的暴力方法储存公司标记(是字符,不是字符串),结果超时了
后来看了DISCUSS,说用位运算,茅塞顿开
还有读取数据的时候用字符读,要小心空格!
位运算是个好东西啊,对于表示有或无,求交和并很方便,且速度快
代码:
#include<iostream> #include<string> using namespace std; int g[205][205]; int get(char x) { return x-'a'+1; } char get2(int x) { return char(x+'a'-1); } int main() { int n,i,j,k,a,b,p,q,t; char com; while(cin>>n&&n) { memset(g,0,sizeof(g)); while(scanf("%d %d",&a,&b)&&a&&b) { getchar(); while(scanf("%c",&com)&&com!=10) { t=get(com); g[a][b]|=1<<t; } } for(k=1;k<=n;k++) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(g[i][k]&g[k][j]) g[i][j]|=g[i][k]&g[k][j]; } } while(scanf("%d %d",&a,&b)&&a&&b) { if(g[a][b]!=0) { i=0; t=g[a][b]; while(t) { if(t&1) printf("%c",get2(i)); t>>=1; i++; } printf("/n"); } else printf("-/n"); } printf("/n"); } return 0; }
相关文章推荐
- poj 2570 Fiber Network(传递闭包,floyd+位运算)
- POJ 2570 Fiber Network(最短路 二进制处理)
- POJ-2570 Fiber Network
- POJ-2570-Fiber Network
- zoj 1967 && poj 2570 Fiber Network
- POJ 2570 Fiber Network
- POJ 2570 Fiber Network
- poj 2570 Fiber Network(floyd)
- poj2570 Fiber Network 最短路floyd
- poj 2570 Fiber Network(最短路+Floyd)
- POJ --2570 Fiber Network
- poj 2570 Fiber Network(最短路+Floyd)
- POJ 2570 Fiber Network
- POJ 2570 Fiber Network(Floyd+位运算)
- POJ 2570 Fiber Network(最短路 二进制处理)
- poj 2570 Fiber Network (Floyd)
- POJ--2570--Fiber Network【floyd+位运算】
- POJ-2570 Fiber Network 状态压缩+floyd
- POJ 2570 Fiber Network
- poj 2570 Fiber Network(floyd)