http://poj.org/problem?id=2570
题目看似与Floyd无关,但是我们可以用Floyd算法的思想去解决。在这里我们将每一位小写字母转化成对应的二进制位,刚好需要一个整型数据来保存结果,通过逻辑与或操作来完成对应位的操作。开始交的时候用g++然后用printf()输出,结果一直超时,改用putchar()后就过了,然后用将语言改为c++ 结果用printf()输出也过了,只不过时间上慢一点。。看来putchar的速度还是很快的。。。
源代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std ;
int map[201][201] ;
int n ;
int main()
{
int i ;
int k ;
int j ;
int p ;
int q ;
char ch ;
char str[27] ;
while(scanf("%d" , &n)!=EOF && n)
{
memset(map , 0 , sizeof(map)) ;
while(scanf("%d %d" , &p , &q ))
{
if(p==0||q==0)
break ;
scanf("%s" , str) ;
for(i = 0 ; str[i] ; i ++)
map[p][q] |= 1<<(str[i]-'a') ;
}
for(k = 1 ; k <= n ; k ++)
for(j = 1 ; j <= n ; j ++)
for(i = 1 ; i <= n ; i ++)
map[j][i] |= map[j][k] & map[k][i] ;
while(scanf("%d %d" , &p , &q))
{
if(p==0 || q==0)
break ;
for(ch='a' ; ch <= 'z' ; ++ch)
if(map[p][q]&(1<<(ch-'a')))
putchar(ch);
if(!map[p][q])
putchar('-') ;
putchar('\n') ;
}
putchar('\n') ;
}
return 0 ;
}