1. 程式人生 > 實用技巧 >b_vj_Fiber Network(floyd思想+狀態壓縮)

b_vj_Fiber Network(floyd思想+狀態壓縮)

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;
}