• 爬格子呀4月份的第一批成果


    第六章撸完了,马上acm校队就要选拔了,争取加点时间把第七章也撸完
    代码如下:
    Uva10305 给任务排序:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    const int maxn = 100+5;
    int c[maxn];//c[u]==0表示从来没有访问过,c[u]==1表示已经访问过,c[u]==-1表示正在访问,递归调用还没有结束
    int G[maxn][maxn];
    int topo[maxn], t, f, tt;
    
    bool dfs(int u) {
        c[u] = -1;
        for (int v = 1; v <= t; v++)
            if (G[u][v]) {
                if (c[v] < 0)
                    return false;
                else if (!c[v])
                    dfs(v);
            }
        c[u] = 1;
        topo[--tt] = u;
        return true;
    }
    
    bool toposort() {
        tt = t;
        memset(c, 0, sizeof(c));
        for (int u = 1; u <= t; u++) {
            if (!c[u])
                if (!dfs(u))//dfs成功完成
                    return false;
        }
        return true;
    }
    
    int main() {
        while (scanf("%d%d", &t, &f) == 2 && t) {
            memset(G, 0, sizeof(G));
            memset(topo, 0, sizeof(topo));
            int u, v;
            for (int i = 0; i < f; i++) {
                scanf("%d%d", &u, &v);
                G[u][v] = 1;
            }
            if (toposort()) {
                printf("%d", topo[0]);
                for (int i = 1; i < t; i++) {
                    printf(" %d", topo[i]);
                }
                printf("
    ");
            }
        }
        return 0;
    }

    Uva10562看图写树

    #include<stdio.h>
    #include<iostream>
    #include<cctype>
    #include<cstring>
    using namespace std;
    
    const int maxn = 100 + 5;
    int n;
    char buf[maxn][maxn];
    
    void dfs(int r, int c) {
        printf("%c(", buf[r][c]);
        if (buf[r + 1][c] == '|'&&r + 1 < n) {
            int i = c;
            while (i - 1 >= 0 && buf[r + 2][i - 1] == '-')
                i--;
            while (buf[r + 2][i] == '-'&&buf[r + 3][i] != '') {
                if (!isspace(buf[r + 3][i]))
                    dfs(r + 3, i);
                i++;
            }
        }
        printf(")");
    }
    
    void solve() {
        n = 0;
        while (1) {
            fgets(buf[n], maxn, stdin);
            if (buf[n][0] == '#') break;
            else n++;
        }
        printf("(");
        if (n == 0) {
            printf(")
    ");
            return;
        }
        for (int i = 0; i < strlen(buf[0]); i++) {
            if (buf[0][i] != ' ') {
                dfs(0, i);
                break;
            }
        }
        printf(")
    ");
    }
    
    int main() {
        int t;
        scanf("%d", &t);
        getchar();
        while (t--) 
            solve();
        return 0;
    }

    Uva12171 雕塑

    #include<cstdio>
    #include<iostream>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    const int maxn = 50 + 5;
    const int maxc = 1000 + 1;
    //original data 
    
    //discreate data
    int nx, ny, nz;
    int xs[maxn * 2], ys[maxn * 2], zs[maxn * 2];
    //flood related
    const int dx[]{ 1,-1,0,0,0,0 };
    const int dy[]{ 0,0,1,-1,0,0 };
    const int dz[]{ 0,0,0,0,1,-1 };
    int color[maxn * 2][maxn * 2][maxn * 2];
    
    struct cell {
        int x, y, z;
        cell(int x=0,int y=0,int z=0):x(x),y(y),z(z){}
        bool valid() const {
            return x >= 0 && x < nx - 1 && y >= 0 && y < ny - 1 && z >= 0 && z < nz - 1;
        }
        bool solid() const {
            return color[x][y][z] == 1;
        }
        bool getvis() const {
            return color[x][y][z] == 2;
        }
        void setvis() const {
            color[x][y][z] = 2;
        }
        cell neighbor(int dir) const {
            return cell(x + dx[dir], y + dy[dir], z + dz[dir]);
        }
        int volume() const {
            return (xs[x + 1] - xs[x])*(ys[y + 1] - ys[y])*(zs[z + 1] - zs[z]);
        }
        int area(int dir) const {
            if (dx[dir] != 0) return (ys[y + 1] - ys[y])*(zs[z + 1] - zs[z]);
            else if (dy[dir] != 0) return (xs[x + 1] - xs[x])*(zs[z + 1] - zs[z]);
            return (xs[x + 1] - xs[x])*(ys[y + 1] - ys[y]);
        }
    };
    
    void discreate(int* x,int &n) {
        sort(x, x + n);
        n = unique(x, x + n) - x;
    }
    
    int ID(int* x, int n, int x0) {
        return lower_bound(x, x + n, x0) - x;
    }
    
    void floodfill(int &v, int &s) {
        v = 0; s = 0;
        cell c;
        c.setvis();
        queue<cell>q;
        q.push(c);
        while (!q.empty()) {
            cell mc = q.front(); q.pop();
            v += mc.volume();
            for (int i = 0; i < 6; i++) {
                cell cc = mc.neighbor(i);
                if (!cc.valid())
                    continue;
                if (cc.solid())
                    s += cc.area(i);
                else if (!cc.getvis()) {
                    cc.setvis();
                    q.push(cc);
                }
            }
        }
        v = maxc*maxc*maxc - v;
    }
    int main() {
        int T;
        scanf("%d", &T);
        int n, x0[maxn], y0[maxn], z0[maxn], x1[maxn], y1[maxn], z1[maxn];
        while (T--) {
            nx = ny = nz = 2;
            xs[0] = ys[0] = zs[0] = 0;
            xs[1] = ys[1] = zs[1] = maxc;
            scanf("%d", &n);
            for (int i = 0; i < n; i++) {
                scanf("%d%d%d%d%d%d", &x0[i], &y0[i], &z0[i], &x1[i], &y1[i], &z1[i]);
                x1[i] += x0[i]; y1[i] += y0[i]; z1[i] += z0[i];
                xs[nx++] = x0[i]; xs[nx++] = x1[i];
                ys[ny++] = y0[i]; ys[ny++] = y1[i];
                zs[nz++] = z0[i]; zs[nz++] = z1[i];
            }
            discreate(xs, nx);
            discreate(ys, ny);
            discreate(zs, nz);
    
            memset(color, 0, sizeof(color));
            for (int i = 0; i < n; i++) {
                int X1 = ID(xs, nx, x0[i]); int X2 = ID(xs, nx, x1[i]); 
                int Y1 = ID(ys, ny, y0[i]); int Y2 = ID(ys, ny, y1[i]);
                int Z1 = ID(zs, nz, z0[i]); int Z2 = ID(zs, nz, z1[i]);
                for (int X = X1; X < X2; X++)
                    for (int Y = Y1; Y < Y2; Y++)
                        for (int Z = Z1; Z < Z2; Z++)
                            color[X][Y][Z] = 1;
            }
    
            int v = 0, s = 0;
            floodfill(v, s);
            printf("%d %d
    ", s, v);
        }
        return 0;
    }

    Uva1572,自对应

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int G[52][52];
    int c[52];
    
    int ID(char a1, char a2) {
        return (a1 - 'A')*2 + (a2 == '+' ? 0 : 1);
    }
    
    void connect(char a1, char a2, char b1, char b2) {
        if (a1 == '0' || b1 ==  '0')    return;
        int u = ID(a1, a2) ^ 1, v = ID(b1, b2);
        G[u][v] = 1;
    }
    
    bool dfs(int u) {
        c[u] = -1;
        for (int v = 0; v < 52; v++) if(G[u][v]){
            if (c[v] < 0) return true;
            else if (c[v]==0 && dfs(v)) return true;
        }
        c[u] = 1;
        return false;
    }
    
    bool topo_sort() {
        memset(c, 0, sizeof(c));
        for (int u = 0; u < 52; u++) if (!c[u])
            if (dfs(u)) return true;
        return false;
    }
    
    int main() {
        int n;
        while (scanf("%d", &n) == 1 && n) {
            memset(G, 0, sizeof(G));
            while (n--) {
                char s[10];
                scanf("%s", s);
                for (int i = 0; i < 4; i++)
                    for (int j = 0; j < 4; j++)
                        if (i != j)
                            connect(s[i * 2], s[i * 2 + 1], s[j * 2], s[j * 2 + 1]);
            }
            if (topo_sort()) printf("unbounded
    ");
            else printf("bounded
    ");
        }
        return 0;
    }

    Uva1599 理想路径

    #include<cstdio>
    #include<iostream>
    #include<vector>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    using namespace std; 
    
    const int maxn = 1000000 + 5;
    const int INF = 1000000000;
    
    struct Edge {
        int u, v, c;
        Edge(int u = 0, int v = 0, int c = 0) :u(u), v(v), c(c) {}
    };
    
    vector<Edge>edges;
    vector<int>G[maxn];
    int n, vis[maxn], d[maxn];
    
    
    void add_Edge(int u, int v, int c) {
        edges.push_back(Edge(u, v, c));
        int idx = edges.size() - 1;
        G[u].push_back(idx);
    }
    
    void rev_bfs() {
        memset(vis, 0, sizeof(vis));
        //memset(d, 0, sizeof(d));
        queue<int>q;
        d[n - 1] = 0; vis[n - 1] = 1;
        q.push(n-1);
        while (!q.empty()) {
            int v = q.front(); q.pop();
            for (int i = 0; i < G[v].size(); i++) {
                int e = G[v][i];
                int u = edges[e].v;
                if (!vis[u]) {
                    d[u] = d[v] + 1;
                    vis[u] = 1;
                    q.push(u);
                }
            }
        }
    }
    
    void bfs() {
        vector<int>ans;
        vector<int>next;
        memset(vis, 0, sizeof(vis));
        vis[0] = 1;
        next.push_back(0);
        for (int i = 0; i < d[0]; i++) {
            int min_color = INF;
            for (int j = 0; j < next.size(); j++) {
                int u = next[j];
                for (int k = 0; k < G[u].size(); k++) {
                    int e = G[u][k];
                    int v = edges[e].v;
                    if (d[u] == d[v] + 1)
                        min_color = min(min_color, edges[e].c);
                }
            }
            ans.push_back(min_color);
            vector<int>next2;
            for (int j = 0; j < next.size(); j++) {
                int u = next[j];
                for (int k = 0; k < G[u].size(); k++) {
                    int e = G[u][k];
                    int v = edges[e].v;
                    if (d[u] == d[v] + 1 && !vis[v] && edges[e].c == min_color) {
                        vis[v] = 1;
                        next2.push_back(v);
                    }
                }
            }
            next = next2;
        }
        printf("%d
    ", ans.size());
        printf("%d", ans[0]);
        for (int i = 1; i < ans.size(); i++)
            printf(" %d", ans[i]);
        printf("
    ");
    }
    
    int main() {
        int u, v, c, m;
        while (scanf("%d%d", &n, &m) == 2) {
            edges.size();
            for (int i = 0; i < n; i++) {
                G[i].clear();   
    
            }
            while (m--) {
                scanf("%d%d%d", &u, &v, &c);
                add_Edge(u-1, v-1, c);
                add_Edge(v-1, u-1, c);
            }
            rev_bfs();
            bfs();
        }
        return 0;
    }

    Uva673括号匹配

    #include<cstdio>
    #include<iostream>
    #include<stack>
    #include<string>
    using namespace std;
    
    int main() {
        int n;
        scanf("%d", &n);
        getchar();
        while (n--) {
            string s;
            getline(cin, s);
            if (s.size() == 0) {
                cout << "Yes"<<endl;
                continue;
            }
            stack<char>a;
            bool flag = true;
            for (int i = 0; i < s.size(); i++) {
                if (s[i] == '(' || s[i] == '[')
                    a.push(s[i]);
                else if (s[i] == ')')
                    if (a.size() == 0||a.top() != '(' )
                    {
                        flag = false;
                        break;
                    }
                    else
                        a.pop();
                else if (s[i] == ']')
                    if (a.size() == 0 || a.top() != '[')
                    {
                        flag = false;
                        break;
                    }
                    else
                        a.pop();
            }
            if (a.size() != 0)
                flag = false;
            if (flag) 
                cout << "Yes"<<endl;
            else 
                cout << "No"<<endl;
        }
        return 0;
    }

    Uva712 s树

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<vector>
    using namespace std;
    char s[8 * 2 + 5], leaf[1 << 8 + 5], vva[8 + 2];
    int str[8 + 2];
    
    int main() {
        int n, m, kase = 0;
        while (scanf("%d", &n) == 1 && n) {
            memset(s, 0, sizeof(s));
            memset(str, 0, sizeof(str));
            for (int i = 0; i < n; i++) {
                scanf("%s", s);
                str[i] = s[1] - '0';
            }
            scanf("%s", leaf);
            scanf("%d", &m);
            vector<char>p;
            while (m--) {
                scanf("%s", vva);
                int len = strlen(vva);
                double left = 0, right = strlen(leaf) - 1;
                for (int i = 0; i < n; i++) {
                    if (vva[str[i] - 1] == '0')
                        right = floor((right + left) / 2);
                    else
                        left = ceil((right + left) / 2);
                }
                p.push_back(leaf[(int)left]);
            }
            printf("S-Tree #%d:
    ", ++kase);
            for (int i = 0; i < p.size(); i++)
                printf("%c", p[i]);
            printf("
    
    ");
        }
        return 0;
    }

    Uva536 树重建

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    char pre1[100000], mid1[100000];
    
    void find(string pre,string mid) {
        if (mid.size() == 1) {
            printf("%c", mid[0]);
            return;
        }
        else if (mid.size() == 0)
            return;
        int pos = mid.find(pre[0]);
        find(pre.substr(1, pos), mid.substr(0, pos));
        find(pre.substr(1 + pos), mid.substr(pos + 1));
        printf("%c", pre[0]);
        return;
    }
    
    int main() {
        while (scanf("%s%s", pre1, mid1) == 2) {
            string pre, mid;
            pre = pre1; mid = mid1;
            find(pre, mid);
            printf("
    ");
        }
        return 0;
    }

    Uva439 骑士的移动

    #include<cstdio>
    #include<iostream>
    #include<queue>
    #include<cstring>
    #include<utility>
    using namespace std;
    
    typedef pair<int, int> P;
    P str, _end;
    
    int vis[10][10], d[10][10];
    int dr[] = { 1,1,2,2,-1,-1,-2,-2 };
    int dc[] = { 2,-2,1,-1,2,-2,1,-1 };
    
    bool legal(int nx, int ny) {
        return nx > 0 && nx <= 8 && ny > 0 && ny <= 8;
    }
    
    int bfs() {
        memset(vis, 0, sizeof(vis));
        memset(d, 0, sizeof(d));
        queue<P>q;
        q.push(str);
        vis[str.first][str.second] = 1;
        d[str.first][str.second] = 0;
        while (!q.empty()) {
            P p = q.front(); q.pop();
            if (p.first == _end.first && p.second == _end.second) 
                 return d[p.first][p.second];
            for (int i = 0; i < 8; i++) {
                int nx = p.first + dr[i];
                int ny = p.second + dc[i];
                if (vis[nx][ny] == 0 && legal(nx, ny)) {
                    vis[nx][ny] = 1;
                    d[nx][ny] = d[p.first][p.second] + 1;
                    q.push(make_pair(nx, ny));
                }
            }
        }
    }
    
    int main() {
        char x0, y0, x1, y1;
        while (scanf("%c%c %c%c", &x0, &y0, &x1, &y1) == 4) {
            str.first = x0 - 'a' + 1; _end.first = x1 - 'a' + 1;
            str.second = 9 - (y0-'0'); _end.second = 9 - (y1-'0');
            printf("To get from %c%c to %c%c takes %d knight moves.
    ", x0, y0, x1, y1, bfs());
            getchar();
        }
        return 0;
    }

    Uva1600 巡逻机器人

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<queue>
    using namespace std;
    
    const int maxn = 20 + 5;
    int kase, m, n, k, vis[maxn][maxn][maxn], G[maxn][maxn];
    int dr[] = { -1,0,0,1 };
    int dc[] = { 0,1,-1,0 };
    
    struct point {
        int x, y, dis, blood;
        point() :x(0), y(0), dis(0), blood(0) {};
        point(int nx,int ny,int ndis, int nblood) :x(nx), y(ny),dis(ndis),blood(nblood) {};
    };
    
    bool legal(int nx, int ny) {
        return nx >= 0 && nx < m&&ny >= 0 && ny < n;
    }
    
    int BFS() {
        memset(vis, 0, sizeof(vis));
        queue<point>q;
        point ini(0, 0, 0, 0);
        q.push(ini);
        vis[ini.x][ini.y][ini.blood] = 1;
        while (!q.empty()) {
            point p = q.front(); q.pop();
            if (p.x == m - 1 && p.y == n - 1)
                return p.dis;
            for (int i = 0; i < 4; i++) {
                int nx = p.x + dr[i];
                int ny = p.y + dc[i];
                int nblood = G[nx][ny] ? p.blood + 1 : 0;
                if (!vis[nx][ny][nblood] && nblood <= k && legal(nx, ny)) {
                    point temp(nx, ny, p.dis + 1, nblood);
                    vis[nx][ny][nblood] = 1;
                    q.push(temp);
                }
            }
        }
        return -1;
    }
    
    int main() {
        scanf("%d", &kase);
        while (kase--) {
            scanf("%d%d", &m, &n);
            scanf("%d", &k);
            memset(G, 0, sizeof(G));
            for (int i = 0; i < m; i++)
                for (int j = 0; j < n; j++)
                    scanf("%d", &G[i][j]);
            printf("%d
    ", BFS());
        }
        return 0;
    }

    Uva12166 修改天平

    #include<cstdio>
    #include<iostream>
    #include<string>
    #include<map>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    
    string s;
    map<LL, int>str;
    
    int main() {
        int n;
        scanf("%d", &n);
        getchar();
        while (n--) {
            LL a;
            int nodeNum = 0, depth = 0;
            str.clear();
            getline(cin, s);
            for (int i = 0; i < s.size(); i++) {
                if (s[i] == '[') depth++;
                if (s[i] == ']') depth--;
                if (s[i] == ',') continue;
                if (isdigit(s[i])) {
                    int j = i + 1;
                    while (1) {
                        if (isdigit(s[j])) {
                            j++;
                            continue;
                        }
                        a = stoll(s.substr(i, j - i));
                        i = j - 1;
                        break;
                    }
                    a <<= depth;
                    str[a] += 1;
                    nodeNum++;
                }
            }
            int k = -1;
            for (auto& p : str)
                k = max(k, p.second);
            printf("%d
    ", nodeNum - k);
        }
        return 0;
    }

    Uva804 Petri网模拟(udebug过)

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<map>
    using namespace std;
    const int maxn = 100 + 5;
    struct Node {
        map<int, int>in;
        map<int, int>out;
    };
    
    int NP, NT;
    int tokenNum[maxn];
    
    int main() {
        int kase = 0;
        int time;
        while (scanf("%d", &NP) == 1 && NP) {
            Node str[maxn];
            memset(tokenNum, 0, sizeof(tokenNum));
            for (int i = 1; i <= NP; i++)
                scanf("%d", &tokenNum[i]);
            getchar();
            scanf("%d", &NT);
            for (int i = 0; i < NT; i++) {
                int tmp;
                while (scanf("%d", &tmp) == 1 && tmp != 0)
                    if (tmp < 0)
                        str[i].out[0 - tmp] += 1;
                    else
                        str[i].in[tmp] += 1;
            }
            scanf("%d", &time);
            int i, j;
            map<int, int>::iterator it, itt;
            for (i = 0; i < time; i++) {
                for (j = 0; j < NT; j++) {
                    int sum = 0;
                    for (it = str[j].out.begin(); it != str[j].out.end(); advance(it, 1)) 
                        if (tokenNum[it->first] < it->second)
                            break;
                    if (it == str[j].out.end()) {
                        for (it = str[j].out.begin(); it != str[j].out.end(); advance(it, 1))
                            tokenNum[it->first] -= it->second;
                        for (it = str[j].in.begin(); it != str[j].in.end(); advance(it, 1))
                            tokenNum[it->first] += it->second;
                        break;
                    }
                }
                if (j == NT)
                    break;
            }
            if (i == time)
                printf("Case %d: still live after %d transitions
    ", ++kase, i);
            else
                printf("Case %d: dead after %d transitions
    ", ++kase, i);
            printf("Places with tokens:");
            for (int i = 0; i <= NT; i++)
                if (tokenNum[i] > 0)
                    printf(" %d (%d)", i , tokenNum[i]);
            printf("
    
    ");
        }
        return 0;
    }

    Uva127 纸牌游戏(2920ms过。。。)

    #include<cstdio>
    #include<iostream>
    #include<string>
    #include<list>
    #include<utility>
    #include<stack>
    using namespace std;
    typedef pair<char, char> P;
    typedef list<stack<P>> Type;
    
    list<stack<P>>str;
    
    void ini(string s) {
        for (int i = 0; i < s.size(); i += 3) {
            stack<P>tmp;
            tmp.push(make_pair(s[i], s[i + 1]));
            str.push_back(tmp);
        }
    }
    
    bool equal(stack<P>a, stack<P>b) {
        P aa = a.top(), bb = b.top();
        return aa.first == bb.first || aa.second == bb.second;
    }
    
    void solve() {
        Type::iterator it = str.begin(), itt=str.begin();
        it++;
        while (it != str.end()) {
            if (str.size() == 35)
                int a = 0;
            if (distance(str.begin(),it) >= 3) {
                itt = it;
                advance(itt, -3);
                if (equal(*itt, *it)) {
                    itt->push(it->top()); it->pop();
                    if (it->size() == 0)
                        str.erase(it);
                    it = str.begin(); 
                    it++;  continue;
                }
            }
            itt = it;
            advance(itt, -1);
            if (equal(*itt, *it)) {
                itt->push(it->top()); it->pop();
                if (it->size() == 0)
                    str.erase(it);
                it = str.begin();
                it++; continue;
            }
            it++;
        }
    }
    
    void print() {
        printf("%d", str.size());
        if (str.size() > 1)
            printf(" piles remaining:");
        else
            printf(" pile remaining:");
        for (auto i : str)
            printf(" %d", i.size());
        cout << endl;
    }
    
    int main() {
        string s;
        while (getline(cin, s) && s[0] != '#') {
            str.clear(); ini(s);
            getline(cin, s); ini(s);
            solve();
            print();
        }
        return 0;
    }

    Uva10410 树重建(未过)

    #include<cstdio>
    #include<iostream>
    #include<vector>
    #include<set>
    #include<algorithm>
    using namespace std;
    typedef vector<int> vi;
    typedef vector<int>::iterator vii;
    //FILE *fp = fopen("stdout.txt", "w");
    
    int n;
    set<int>str[1000 + 5];
    
    vi find(vi bfs, vi dfs) {
        vi tmp;
        vii tmp1;
        for (int i = 0; i < bfs.size(); i++) {
            if (find(dfs.begin(), dfs.end(), bfs[i]) != dfs.end())
                tmp.push_back(bfs[i]);
        }
        return tmp;
    }
    
    void solve(vi s_bfs, vi s_dfs) {
        //处理两个
        if (s_bfs.size() == 2 && s_dfs.size() == 2) {
            str[s_bfs[0]].insert(s_bfs[1]);
            return;
        }
        //处理三个
        if (s_bfs.size() == 3 && s_dfs.size() == 3) {
            if (s_bfs[1] > s_bfs[2]) {
                str[s_bfs[0]].insert(s_bfs[1]); str[s_bfs[1]].insert(s_bfs[2]);
                return;
            }
            str[s_bfs[0]].insert(s_bfs[1]); str[s_bfs[0]].insert(s_bfs[2]);
            return;
        }
        vii pos1 = find(s_dfs.begin(), s_dfs.end(), s_bfs[1]);
        vii pos2 = find(s_dfs.begin(), s_dfs.end(), s_bfs[2]);
        vi dfs1, dfs2, bfs1, bfs2;
        //两个孩子
        if (s_bfs[1] < s_bfs[2] && pos2 - pos1>1) {
            str[s_bfs[0]].insert(s_bfs[1]); str[s_bfs[0]].insert(s_bfs[2]);
            dfs1.assign(pos1, pos2);  dfs2.assign(pos2, s_dfs.end());
            vi mid1(find(s_bfs, dfs1)), mid2 = (find(s_bfs, dfs2));
            bfs1.swap(mid1); bfs2.swap(mid2);
            solve(bfs1, dfs1);
            if (pos2 != s_dfs.end() - 1)
                solve(bfs2, dfs2);
            return;
        }
        //一个孩子
        if (s_bfs[1] > s_bfs[2] || pos1 == pos2 + 1) {
            str[s_bfs[0]].insert(s_bfs[1]);
            pos1 = s_bfs.begin() + 1; pos2 = s_dfs.begin() + 1;
            bfs1.assign(pos1, s_bfs.end()); dfs1.assign(pos2, s_dfs.end());
            solve(bfs1, dfs1);
            return;
        }
    }
    
    void print() {
        for (int i = 1; i <= n; i++) {
            printf("%d:", i);
            //fprintf(fp,"%d:", i);
            if (str[i].size() != 0)
                for (auto j : str[i])
                    printf(" %d", j);
                    //fprintf(fp, " %d", j);
            printf("
    ");
            //fprintf(fp,"
    ");
        }
    }
    
    int main() {
        while (scanf("%d", &n)==1&&n!=0) {
            for (int i = 1; i <= n; i++)
                str[i].clear();
            getchar();
            vi s_bfs, s_dfs;
            int tmp;
            for (int i = 0; i < n; i++) {
                scanf("%d", &tmp);
                s_bfs.push_back(tmp);
            }
            for (int i = 0; i < n; i++) {
                scanf("%d", &tmp);
                s_dfs.push_back(tmp);
            }
            solve(s_bfs, s_dfs);
            print(); 
        }
        return 0;
    }

    Uva10410 树重建(已过)

    //给定一个树的bfs和dfs,求每个节点的儿子列表
    /*
      按bfs的序列来模拟dfs的输入,通过栈来实现,因为bfs映射了每个节点到根的距离,
      所以再读入bfs序列后,通过栈的方式来模拟dfs的进程,如果dfs读入的数据的位置
      大于站定元素的位置,那说明他就是这个元素的儿子,将其入栈,这因为这是dfs型的
      遍历,你每次肯定会在遍历栈顶元素之后遍历它的儿子,当读入元素的位置小于栈顶元
      素时,表明栈顶元素已经是叶节点,此时你应该回溯,这时候就是栈顶元素出栈,继续
      上述操作,直到dfs序列遍历完毕
    */
    #include<cstdio>
    #include<iostream>
    #include<vector>
    #include<stack>
    using namespace std;
    
    const int maxn = 1000 + 5;
    vector<int>G[maxn];
    int pos[maxn], n;
    
    int main() {
        while (scanf("%d", &n) == 1) {
            int x;
            for (int i = 1; i <= n; i++) {
                scanf("%d", &x);
                G[i].clear();
                pos[x] = i;
            }
            int root;
            stack<int>sta;
            scanf("%d", &root);
            sta.push(root);
            for (int i = 1; i < n; i++) {
                scanf("%d", &x);
                while (true) {
                    int u = sta.top();
                    if (u == root || pos[u] + 1 < pos[x]) {
                        G[u].push_back(x);
                        sta.push(x);
                        break;
                    }
                    else
                        sta.pop();
                }
            }
            for (int i = 1; i <= n; i++) {
                printf("%d:", i);
                for (int j = 0; j < G[i].size(); j++) {
                    printf(" %d", G[i][j]);
                }
                printf("
    ");
            }
        }
        return 0;
    }

    Uva12118 检察员的难题

    /*题意:
      V个城市,E个指定道路,每个城市间都有一条长为T的路,不要求起点终点,
      求最短走完要求路的长度
    */
    /*求解思路:
      E条指定道路是必须走的,所以我们只需要关心哪些路是需要额外走的,
      dfs求联通块,每个联通块内求这些点是否存在欧拉道路,即判断奇度
      数点的个数P(无向图最多存在两个),若P大于2,则需要增加
      ((P-2)/2)条道路使其构成欧拉道路,再通过求出来的联通快的个数
      判断需要在不同联通快间加多少条道路
    */
    
    #include<cstdio>
    #include<iostream>
    #include<vector>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    const int maxn = 1000 + 5;
    int V, E, T, vis[maxn];
    vector<int>G[maxn];
    
    int dfs(int u,int cnt) {
        if (vis[u]) return 0;
        vis[u] = cnt;
        int sz = G[u].size();
        int oddNum = sz % 2;
        for (int j = 0; j < sz; j++)
            oddNum += dfs(G[u][j], cnt);
        return oddNum;
    }
    
    int main() {
        int kase = 0;
        while (scanf("%d%d%d", &V, &E, &T) == 3 && (V || E || T)) {
            for (int i = 0; i < V; i++)
                G[i].clear();
            memset(vis, 0, sizeof(vis));
            int m, n;
            for (int i = 0; i < E; i++) {
                scanf("%d%d", &m, &n);
                G[m - 1].push_back(n - 1);
                G[n - 1].push_back(m - 1);
            }
            int cnt = 0, len = E;
            for (int i = 0; i < V; i++) {
                if (vis[i] || G[i].empty())
                    continue;
                len += max(0, (dfs(i, ++cnt) - 2) / 2);//运算结果可能为负数,所以用max
            }
            printf("Case %d: %d
    ", ++kase, T*(len + max(0, cnt - 1)));
        }
        return 0;
    }

    课程作业,乱点鸳鸯谱(更新版44种情况)

    #include<cstdio>
    #include<iostream>
    #include<vector>
    using namespace std;
    vector<int>compare;//标准情况比较数组
    
    int kase;
    
    void print_permutation(int n, int *ans, int cur){
    
        if (cur == n) {
            printf( "The %d situation:
    ", ++kase);
            for (auto i : compare) printf("%d ", i);
            printf("
    ");
            for (int i = 0; i < n; i++)
                printf("%d", ans[i]);
            printf("
    
    ");
        }
        else
            for (int i = 1; i <= n; i++) {
                int ok = 1;//标志符,为1表示可以填充
                if (compare[cur] != i) {
                    for (int j = 0; j < cur; j++)
                        //if (ans[j] == i || compare[cur - 1] == i)
                        if (ans[j] == i)
                            //前者表示已经用过,后者表示对应位相等
                            ok = 0;
                    if (ok) {
                        ans[cur] = i;
                        print_permutation(n, ans, cur + 1);
                    }
                }
            }
    }
    
    int main() {
        int ans[6];
        for (int i = 1; i <= 5; i++)
            compare.push_back(i);
        print_permutation(5, ans, 0);
        //第一个参数表示要求生成排列的总位数,第二个表示当前位数
        return 0;
    }

    继续加油!

  • 相关阅读:
    DB2 9 基础根基(730 测验)认证指南,第 2 部门: 安适性(1)
    DB2 9 根底(730 考验)认证指南,第 3 部门: 访问 DB2 数据(7)
    IT人 软件工程师的务实职业生涯规划
    《Delphi 算法与数据结构》学习与感悟[8]: 单向链表的添加、删除与遍历
    《Delphi 算法与数据结构》简介及下载
    《Delphi 算法与数据结构》学习与感悟[1]: 通过 "顺序查找" 与 "二分查找" 说明算法的重要性
    《Delphi 算法与数据结构》学习与感悟[2]: 数据对齐
    学习 TTreeView [14] StateIndex(状态图标)、OverlayIndex(叠加图标)
    《Delphi 算法与数据结构》学习与感悟[3]: 获取一个字节中非空位的个数
    《Delphi 算法与数据结构》学习与感悟[6]: 一个简单的"单向链表"
  • 原文地址:https://www.cnblogs.com/romaLzhih/p/9489847.html
Copyright © 2020-2023  润新知