uva 219 - Department of Redundancy Department(dfs+剪枝)

來源:互聯網
上載者:User

標籤:style   http   color   os   io   art   

題目連結:uva 219 - Department of Redundancy Department

題目大意:給定一些關係,問哪一些關係是可以被替代的,如果可以被替代,給出替代的方案,一種即可。

解題思路:因為總共也就26個字母,所以用位元表示狀態。剪枝,每次將所有可選關係均考慮進去都無法滿足則是false。

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 105;bool flag;int n, l[maxn], r[maxn];int cnt, ans[maxn], v[maxn];inline void cat (char* str, int x) {    bool sign = false;    int len = strlen(str);    for (int i = 0; i < len; i++) {        if (str[i] >= ‘A‘ && str[i] <= ‘Z‘) {            if (sign)                r[x] |= (1<<(str[i] - ‘A‘));            else                l[x] |= (1<<(str[i] - ‘A‘));        } else            sign = true;    }}inline void init () {    char str[maxn];    flag = true;    memset(l, 0, sizeof(l));    memset(r, 0, sizeof(r));    for (int i = 0; i < n; i++) {        scanf("%s", str);        cat(str, i);    }}inline void put (int k) {    printf("     FD %d is redundant using FDs:", k + 1);    for (int i = 0; ans[i] != -1; i++)        printf(" %d", ans[i]);    printf("\n");}bool check (int s, int k) {    int vis[maxn];    memset(vis, 0, sizeof(vis));    while (true) {        bool stop = true;        for (int i = 0; i < n; i++) {            if (vis[i] || v[i])                continue;            if ((s & l[i]) != l[i])                continue;            vis[i] = 1;            s |= r[i];            stop = false;        }        if (stop)            break;    }    return (s | r[k]) != s;}bool dfs (int d, int s, int k) {    ans[d] = -1;    if ((s & r[k]) == r[k])        return true;    if (check(s, k))        return false;    for (int i = 0; i < n; i++) {        if (v[i])            continue;        if ((s & l[i]) != l[i])            continue;        if ((s | r[i]) == s)            continue;        v[i] = 1;        if (dfs(d, s, k))            return true;        ans[d] = i + 1;        if (dfs(d+1, s | r[i], k))            return true;        v[i] = 0;    }    return false;}void solve () {    for (int i = 0; i < n; i++) {        memset(v, 0, sizeof(v));        v[i] = 1;        if (dfs(0, l[i], i)) {            put(i);            flag = false;        }    }}int main () {    int cas = 1;    while (scanf("%d", &n) == 1 && n) {        init();        printf("Set number %d\n", cas++);        solve();        if (flag)            printf("     No redundant FDs.\n");        printf("\n");    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.