栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3393 Routing

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3393 Routing

#include <map>#include <queue>#include <cstdio>#include <string>#include <vector>#include <algorithm>using namespace std;void dump(const vector<int>& v) {    for (int i = 0; i < (int)v.size(); ++i) {        printf("%d ", v[i]);    }    puts("");}vector<int> P[16], Q[16];map<int, int> minv(int n, const vector<int>& p) {    map<int, int> ret;    for (int i = 0; i < n; ++i) {        ret[p[i]] = i;    }    return ret;}vector<int> inv(int n, const vector<int>& p) {    vector<int> ret(n);    for (int i = 0; i < n; ++i) {        ret[p[i]] = i;    }    return ret;}vector<int> per(int n, const vector<int>& s, const vector<int>& t) {    map<int, int> rt = minv(n, t);    vector<int> ret(n);    for (int i = 0; i < n; ++i) {        ret[i] = rt[s[i]];    }    return inv(ret.size(), ret);}vector<string> gao(int n, vector<int> p) {    if (n == 1) {        if (p[0] == 0) { return vector<string>(1, "0");        } else { return vector<string>(1, "1");        }    } else {        int s = 1 << n;        int m = 1 << (n - 1);        vector<int> rp = inv(s, p);        vector<int> d(s, 0);        for (int i = 0; i < s; ++i) { if (d[i] != 0) {     continue; } queue<int> q; d[i] = -1;   q.push(i); while (!q.empty()) {     int k = q.front();     q.pop();     if (d[k ^ 1] == 0) {         d[k ^ 1] = -d[k];         q.push(k ^ 1);     }     if (d[p[rp[k] ^ 1]] == 0) {         d[p[rp[k] ^ 1]] = -d[k];         q.push(p[rp[k] ^ 1]);     } }        }        vector<int> xs, xt, ys, yt;        string x, y;        for (int i = 0; i < s; i += 2) { if (d[i] == -1) {     x += '0';     xs.push_back(i);     ys.push_back(i ^ 1); } else {     x += '1';     ys.push_back(i);     xs.push_back(i ^ 1); }        }        for (int i = 0; i < s; i += 2) { if (d[p[i]] == -1) {     y += '0';     xt.push_back(p[i]);     yt.push_back(p[i ^ 1]); } else {     y += '1';     yt.push_back(p[i]);     xt.push_back(p[i ^ 1]); }        }        vector<string> ret, left, right;        ret.push_back(x);        left = gao(n - 1, per(m, xs, xt));        right = gao(n - 1, per(m, ys, yt));        for (int i = 0; i < (int)left.size(); ++i) { ret.push_back(left[i] + right[i]);        }        ret.push_back(y);        return ret;    }}void init() {    for (int n = 1; n <= 13; ++n) {        P[n].resize(1 << n);        for (int j = 0; j < (int)P[n].size(); ++j) { P[n][j] = (j >> 1) ^ ((j & 1) << (n - 1));        }        Q[n] = inv(P[n].size(), P[n]);    }}int main() {    bool blank = false;    int n;    vector<int> p;    vector<string> s;    init();    while (scanf("%d", &n) != EOF && n > 0) {        if (blank) { puts("");        } else { blank = true;        }        p.resize(1 << n);        for (int i = 0; i < (int)p.size(); ++i) { scanf("%d", &p[i]);        }        s = gao(n, p);        for (int i = 0; i < (int)s.size(); ++i) { puts(s[i].c_str());        }    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/366085.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号