您的位置:首页 > 其它

zoj 1967 Fiber Network

2013-08-15 10:43 134 查看
题目大意是一张地图中n个公司建立一些点间的线路,对每次查询A,B,输出A,B间可通过哪些公司的线路连接。

floyd变形,m[ i ][ j ]表示 i 到 j 间可以通过的公司的线路,对于公司的表示利用位运算,每个小写字母代表一个公司,所以不超过26位,如000.....00101代表公司a和c,0000....111代表公司a,b,c,则方程为m[ i ][ j ]|=m[ i ][ k ]&m[ k ][ j ]。

#include <stdio.h>
#include <string.h>
int main()
{
int m[300][300],n,A,B;
int i,j,k;
char str[30],ch;
while(1)
{
memset(m,0,sizeof(m));
scanf("%d",&n);
if(n==0)
break;
while(1)
{
scanf("%d%d",&A,&B);
if(A==0&&B==0)
break;
getchar();
scanf("%s",str);
for(i=0;str[i];i++)
m[A][B]|=1<<(str[i]-'a');  //位运算表示公司集合
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
m[i][j]|=(m[i][k]&m[k][j]);
while(1)
{
scanf("%d%d",&A,&B);
if(A==0&&B==0)
break;
for(ch='a';ch<='z';ch++)
{
if(m[A][B]&(1<<(ch-'a')))
printf("%c",ch);
}
if(!m[A][B])
printf("-");
printf("\n");
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: