POJ2570
2014-04-15 20:05
246 查看
题意:某条道路由一些公司修建,修建道路的公司可以提供这条路上的连通,询问哪些公司可以提供从A到B的路径.每个公司由一个小写字母表示。
思路:因为只有26个字母 所以可能用二进制去表示每个公司 1表示该路径上有该公司 比如说 1-->3 这条路径上有 abc这三个公司 则mat[1][3] 二进制表示为00..0111; 然后就是用floyd传递闭包。
#include <iostream>
#include <stdio.h>
#include <string.h>
#define maxn 500+ 10
using namespace std;
int map[maxn][maxn];
void printf(int n)
{
char s[30];
int k = 0;
int count = 0;
while(n)
{
if( n&1) // 取二进制数的末尾,如果是0就跳过,是1就输出所对对应的字母;
s[k++] = 'a' + count;
count++; //是的字母按照位输出,末尾代表‘a'前一位代表'b'一次类推;
n = n >> 1; // 把位数向前移;
}
s[k] = '\0';
printf ("%s\n",s);
}
int main()
{
int n;
int a, b;
char str[30];
while(scanf("%d",&n),n)
{
memset(map,0,sizeof(map));
while(scanf("%d%d",&a,&b) &&a && b)
{
scanf("%s",str);
for( int i = 0; str[i] !='\0'; i++)
{
map[a][b] = map[a][b] | (1<<(str[i] -'a'));
}
}
for( int k = 1; k<=n; k++)
for( int i = 1; i<=n; i++)
for( int j = 1; j<=n; j++) //注意三个循环顺序不能反,每次是根据中间节点挑选是否更新
if(map[i][k] & map[k][j]) // 根据题意得map[i][k]交map[k][j]=map[i][k]
map[i][j] = map[i][j]|(map[i][k] & map[k][j]); //最初的并上新加入的;
while(scanf("%d%d",&a ,&b) &&a&& b)
{
if (map[a][b])
printf(map[a][b]);
else
printf ("-\n");
}
printf ("\n");
}
return 0;
}
思路:因为只有26个字母 所以可能用二进制去表示每个公司 1表示该路径上有该公司 比如说 1-->3 这条路径上有 abc这三个公司 则mat[1][3] 二进制表示为00..0111; 然后就是用floyd传递闭包。
#include <iostream>
#include <stdio.h>
#include <string.h>
#define maxn 500+ 10
using namespace std;
int map[maxn][maxn];
void printf(int n)
{
char s[30];
int k = 0;
int count = 0;
while(n)
{
if( n&1) // 取二进制数的末尾,如果是0就跳过,是1就输出所对对应的字母;
s[k++] = 'a' + count;
count++; //是的字母按照位输出,末尾代表‘a'前一位代表'b'一次类推;
n = n >> 1; // 把位数向前移;
}
s[k] = '\0';
printf ("%s\n",s);
}
int main()
{
int n;
int a, b;
char str[30];
while(scanf("%d",&n),n)
{
memset(map,0,sizeof(map));
while(scanf("%d%d",&a,&b) &&a && b)
{
scanf("%s",str);
for( int i = 0; str[i] !='\0'; i++)
{
map[a][b] = map[a][b] | (1<<(str[i] -'a'));
}
}
for( int k = 1; k<=n; k++)
for( int i = 1; i<=n; i++)
for( int j = 1; j<=n; j++) //注意三个循环顺序不能反,每次是根据中间节点挑选是否更新
if(map[i][k] & map[k][j]) // 根据题意得map[i][k]交map[k][j]=map[i][k]
map[i][j] = map[i][j]|(map[i][k] & map[k][j]); //最初的并上新加入的;
while(scanf("%d%d",&a ,&b) &&a&& b)
{
if (map[a][b])
printf(map[a][b]);
else
printf ("-\n");
}
printf ("\n");
}
return 0;
}
相关文章推荐
- easyui 打开多个tab页签,切换到第一次打开的页签时,其内容总是别的页签内容解决办法。
- leetcode-First Missing Positive(2014.2.25)
- 常见C++内存池技术
- poj3615
- CentOs yum遇到的小问题
- CreateThread()和_biginthreadex()
- leetcode-Jump Game(2014.2.23)
- 英文文档常用术语
- 一个简单的shell面试题引发的总结
- 新手开车 驾驶小秘诀要牢记
- 从原理角度解析Android (Java) http 文件上传
- Java—内部类
- 图片滤镜功能的代码设计
- 从原理角度解析Android (Java) http 文件上传
- 常见浏览器兼容性问题与解决方案
- 从原理角度解析Android (Java) http 文件上传
- 从原理角度解析Android (Java) http 文件上传
- HDU4347--The Closest M Points(KD树)
- leetcode-Jump Game II (2014.3.3)
- 什么是转向灯?使用转向灯有何技巧?