您的位置:首页 > 其它

poj 2570 Fiber Network(floyd)

2013-04-23 09:27 330 查看
题意:某条道路由一些公司修建,修建道路的公司可以提供这条路上的连通,询问哪些公司可以提供从A到B的路径.每个公司由一个小写字母表示。

思路:因为只有26个字母 所以可能用二进制去表示每个公司 1表示该路径上有该公司 比如说 1-->3
这条路径上有 abc这三个公司 则mat[1][3] 二进制表示为00..0111;
然后就是用floyd传递闭包。

//408K
63MS

#include <stdio.h>

#include <string.h>

#define M 250

int mat[M][M];

void print(int num)

{

char
s[30];

int k =
0,count = 0;

while
(num)

{

if (num&1)

s[k++] = 'a' + count;

count ++;

num = num>>1;

}

s[k] =
'\0';

printf
("%s\n",s);

}

int main ()

{

char
str[30];

int
n,u,v;

while (scanf
("%d",&n)&&n)

{

memset (mat,0,sizeof(mat));

while (scanf ("%d%d",&u,&v))

{

if (u == 0 && v == 0)

break;

scanf ("%s",str);

for (int i = 0;str[i]!= '\0';i
++)
//转换成二进制表示

mat[u][v] =
mat[u][v]|(1<<(str[i]-'a'));

}

for (int k = 1;k <= n;k
++)
//floyd

for (int i = 1;i <= n;i ++)

for (int j = 1;j <= n;j ++)

if (mat[i][k]&mat[k][j])

mat[i][j] = mat[i][j]|(mat[i][k]&mat[k][j]);

while (scanf ("%d%d",&u,&v))

{

if (u == 0 && v == 0)

break;

if (mat[u][v])

print (mat[u][v]);

else

printf ("-\n");

}

printf ("\n");

}

return
0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: