poj2942 Knights of the Round Table,無向圖點雙聯通,二分圖判定

來源:互聯網
上載者:User

標籤:style   http   color   io   ar   for   art   sp   on   

點擊開啟連結


無向圖點雙聯通,二分圖判定

<span style="font-size:18px;">#include <cstdio>#include <stack>#include <vector>#include <algorithm>#include <cstring>using namespace std;struct Edge{    int u, v;};const int maxn = 1005;int pre[maxn], iscut[maxn], bccno[maxn],dfs_clock, bcc_cnt;vector<int> G[maxn], bcc[maxn];stack<Edge> S;int dfs(int u, int fa){    int lowu = pre[u] = ++dfs_clock;    int child = 0;    for(int i=0; i<G[u].size(); ++i){        int v = G[u][i];        Edge e = (Edge){u, v};        if(!pre[v]){            S.push(e);            child++;            int lowv = dfs(v, u);            lowu = min(lowu, lowv);            if(lowv>=pre[u]){                iscut[u] = true;                bcc_cnt++; bcc[bcc_cnt].clear();                for(;;){                    Edge x = S.top(); S.pop();                    if(bccno[x.u]!=bcc_cnt){                        bcc[bcc_cnt].push_back(x.u); bccno[x.u] = bcc_cnt;                    }                    if(bccno[x.v] != bcc_cnt){                        bcc[bcc_cnt].push_back(x.v); bccno[x.v] = bcc_cnt;                    }                    if(x.u==u && x.v==v) break;                }            }        }        else if(pre[v]<pre[u] &&v!=fa){            S.push(e);            lowu = min(lowu, pre[v]);        }    }    if(fa < 0 && child == 1) iscut[u] = 0;    return lowu;}void find_bcc(int n){    memset(pre, 0, sizeof pre );    memset(iscut, 0, sizeof iscut );    memset(bccno, 0, sizeof bccno );    dfs_clock = bcc_cnt = 0;    for(int i=0; i<n; ++i)        if(!pre[i]) dfs(i, -1);}int odd[maxn], color[maxn];bool bipartite(int u, int b){    for(int i=0; i<G[u].size(); ++i){        int v = G[u][i]; if(bccno[v]!=b)continue;        if(color[v]==color[u]) return false;        if(!color[v]){            color[v] = 3 - color[u];            if(!bipartite(v, b)) return false;        }    }    return true;}int A[maxn][maxn];int main(){#ifndef ONLINE_JUDGE    freopen("in.cpp", "r", stdin);    freopen("out.cpp", "w", stdout);#endif // ONLINE_JUDGE    int kase = 0, n, m;    while(scanf("%d%d", &n, &m)==2 &&n){        for(int i=0; i<n; ++i)G[i].clear();        memset(A, 0, sizeof A );        for(int i=0; i<m; ++i){            int u, v;            scanf("%d%d", &u, &v);            u--; v--;            A[u][v] = A[v][u] = 1;        }        for(int u=0; u<n; ++u)//避免重邊            for(int v=u+1; v<n; ++v)                if(!A[u][v]) {                    G[u].push_back(v);                    G[v].push_back(u);                }        find_bcc(n);        memset(odd, 0, sizeof odd );        for(int i=1; i<=bcc_cnt; ++i){            memset(color, 0, sizeof color );            for(int j=0; j<bcc[i].size(); ++j) bccno[bcc[i][j]] = i;            int u = bcc[i][0];            color[u] = 1;            if(!bipartite(u, i))                for(int j=0; j<bcc[i].size(); ++j) odd[bcc[i][j]] = 1;        }        int ans = n;        for(int i=0; i<n; ++i) if(odd[i]) ans--;        printf("%d\n", ans);    }    return 0;}</span>


poj2942 Knights of the Round Table,無向圖點雙聯通,二分圖判定

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.