b_vj_Fiber Network(floyd思想+狀態壓縮)
阿新 • • 發佈:2020-11-06
Internet服務供應商想知道從站點A傳送資料到站點B哪謝公司提供了必要的連線(就是在鏈路中都出現過的公司)。
思路:f[i][j]的值表示從結點i到j經過了那些必要的公司,由於最多隻有26個公司,故可將狀態進行壓縮
#include <cstdio> #include <cstring> #include <string> #include <cstdlib> using namespace std; const int N=205; int n,f[N][N]; char s[N]; void floyd() { for (int k=1; k<=n; k++) for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) { f[i][j]|=f[i][k]&f[k][j]; } } int main() { while (scanf("%d",&n), n) { int u,v; memset(f,0,sizeof f); while (scanf("%d%d",&u,&v), u) { scanf("%s",s); for (int i=0; i<strlen(s); i++) f[u][v]|=(1<<(s[i]-'a')); } floyd(); while (scanf("%d%d",&u,&v), u) { int st=f[u][v], c=0; //c表示st的第幾位 while (st) { if (st&1) putchar(c+'a'); st>>=1, c++; } if (c==0) putchar('-'); putchar('\n'); } putchar('\n'); } return 0; }