题目大意:现给出每条边的供应商,让你求若要使某两个点连通所需要的供应商有哪些。
算法思想:赤裸裸的floyd算法再加上位运算优化,如何为运算呢,假设1-2的的供应商为abc那就表示为00000000000000000000000111,2-3的供应商为ad,那就表示为00000000000000000000001001。因为有26个字母,所以表示为26位。这样表示完了之后在floyd算法里就只需要进行简单的与或操作就行了。
#include<iostream> #include<cstring> #include<string> #include<cstdio> using namespace std; int a[205][205]; int t; int a1,a2,q1,q2; char str[30]; void floyd() { for(int k=1;k<=t;k++) { for(int i=1;i<=t;i++) { for(int j=1;j<=t;j++) { a[i][j]=(a[i][j]|(a[i][k]&a[k][j])); } } } } int main() { while(scanf("%d",&t),t) { memset(a,0,sizeof(a)); while(true) { scanf("%d%d",&a1,&a2); if(a1==0&&a2==0) break; scanf("%s",str); for(int i=0;str[i]!='\0';i++) { a[a1][a2]=a[a1][a2]|(1<<(str[i]-'a')); } } floyd(); while(true) { int have=false; scanf("%d%d",&q1,&q2); if(q1==0&&q2==0) break; for(char i='a';i<='z';i++) { int flag=0; if(a[q1][q2]&(1<<(i-'a'))) { printf("%c",i); have=true; } } if(!have) printf("-"); printf("\n"); } printf("\n"); } return 0; }