zoj 1967 Fiber Network

题目大意是一张地图中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("
");
		}
		printf("
");
	}
	return 0;
}


 

原文地址:https://www.cnblogs.com/vermouth/p/3710223.html