把图中边的连通状态(一条边有几个公司公用)压缩成二进制。
通过G[i][j]=G[i][j]|(G[i][k]&G[k][j]); 完成floyd的传递闭包,其实也就是状态转移。
#include<cstdio>
#include<cstring>
int G[205][205];
void floyd(int n)
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
if(G[i][k]==0) continue;
for(int j=1;j<=n;j++)
{
G[i][j]=G[i][j]|(G[i][k]&G[k][j]);
}
}
}
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
memset(G,0,sizeof(G));
char str[30];
int a,b;
while(scanf("%d%d",&a,&b)&&(a||b))
{
scanf("%s",str);
int len=strlen(str);
for(int i=0;i<len;i++)
{
G[a][b]+=(1<<(str[i]-'a'));
}
}
floyd(n);
while(scanf("%d%d",&a,&b)&&(a||b))
{
bool is_print=0;
//printf("ans=%d\n",G[a][b]);
for(int i=0;i<26;i++)
{
if((1&G[a][b]>>i)==0) continue;
putchar(i+'a');
is_print=1;
}
if(is_print==0) putchar('-');
putchar('\n');
}
putchar('\n');
}
return 0;
}