题意:

      给你一个有向图,两点之间有多种连接方式,然后每次询问都问你点A,B之间有哪些方式可以到达,每个小字母是一个方式.

思路:

      很巧妙的位运算和Floyd应用,借助Floyd的更新过程,去更新任意两组边组合起来的长边,如 map[i][j] 是由 map[i][k] 和 map[k]][j]接起来的,更新方式很容易理解,是map[i][j] = map[i][j] | (map[i][k] & map[k][j]),每条边的状态都转化成2进制就行了。


#include<stdio.h>
#include<string.h> int map[205][205]; int Pow(int n)
{
int p = 1;
for(int i = 1 ;i <= n ;i ++)
p *= 2;
return p;
} int main ()
{
int n;
int a ,b ,l ,i ,j ,k;
char str[100];
while(~scanf("%d" ,&n) && n)
{
memset(map ,0 ,sizeof(map));
while(scanf("%d %d" ,&a ,&b) && a + b)
{
scanf("%s" ,str);
l = strlen(str);
for(i = 0 ;i < l ;i ++)
map[a][b] += Pow(str[i] - 'a');
} for(k = 1 ;k <= n ;k ++)
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= n ;j ++)
map[i][j] = map[i][j] | (map[i][k] & map[k][j]); while(scanf("%d %d" ,&a ,&b) && a + b)
{
int mk = 0;
for(i = 0 ;i < 26 ;i ++)
{
if(map[a][b] & Pow(i))
{
printf("%c" ,'a' + i);
mk = 1;
}
}
if(!mk) printf("-");
printf("\n");
}
printf("\n");
}
return 0;
}

最新文章

  1. Dagger2系列之使用方法
  2. redis慢查询日志
  3. JIRA FOR LINUX 安装过程
  4. mysql内存使用以及优化中需要的几点注意
  5. Linux学习笔记16--Linux扩展权限
  6. 获取 AlertDialog自定义的布局 的控件
  7. 执行maven-build.cmd失败
  8. C ~ 一个串口接收思路
  9. Firefly是什么?有什么特点?
  10. asp.net 服务器端缓存与客户端缓存 [转]
  11. 深入解读ESB与SOA的关系
  12. 【PAT】1025. PAT Ranking (25)
  13. nginx配置tomcat负载均衡,nginx.conf配置文件的配置
  14. yum2
  15. 禁用selinux
  16. C. Sequence Transformation
  17. 函数参数,const 引用 和 非 const引用是不同的函数。
  18. PostgreSQL获取table名,字段名
  19. 虚拟机可以ping同宿主机,宿主机ping不通虚拟机
  20. 利用Python玩微信跳一跳

热门文章

  1. #String类简述(小白理解,小白编写,欢迎大神指点,小白跪谢)
  2. PowerShell的使用
  3. MyBatis(四):自定义持久层框架优化
  4. freebsd root 登录 KDE SDDM
  5. 09、集合set
  6. 在Windows10搭建WebAssembly开发环境
  7. protobuf基于java和javascript的使用
  8. MongoDB4.2 分片扫盲说明
  9. Android Studio 之 RadioButton
  10. Android Studio 有关 RecycleView 的使用