• hdu 1526 poj 1087最大流


    好恶心的题目,题面那么长,害我折腾了几个小时。。。刚开始是在杭电做的这题,打完代码以后交不过,不得已查解题报告,才发现poj上也有这题。看了别人的解题报告之后才发现自己理解错了。于是推倒重来,重新写,可还是不过。问了问金牛,才发现居然还是理解错了题目,晕死啊。。。。最后根据那组数据调了一会儿,就过了。

    我的做法跟网上别人的做法一样,用的最大流。建图的时候,加一个源点一个汇点,源点连插座,流量为1,插座连电器,流量为1,电器连汇点,流量为1,然后如果插座A能通过适配器转换成插座B,就连A到B,流量无穷大。最大流就是最多能插上的电器数了。

    /*
     * hdu1526/win.cpp
     * Created on: 2013-1-4
     * Author    : ben
     */
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <set>
    #include <map>
    #include <stack>
    #include <string>
    #include <vector>
    #include <deque>
    #include <list>
    #include <functional>
    #include <numeric>
    #include <cctype>
    using namespace std;
    typedef int typec;
    const typec inf = 0x7fffffff;
    const int MAXE = 300000;
    const int MAXN = 700;
    const int MAXCUR = 500;
    const int END = 650;
    const int PY = 520;
    
    typedef struct {
        int x, y, nxt;
        typec c;
    } Edge;
    Edge bf[MAXE];
    int ne, head[MAXN], cur[MAXN], ps[MAXN], dep[MAXN];
    void addedge(int x, int y, typec c) {
        bf[ne].x = x;
        bf[ne].y = y;
        bf[ne].c = c;
        bf[ne].nxt = head[x];
        head[x] = ne++;
        bf[ne].x = y;
        bf[ne].y = x;
        bf[ne].c = 0;
        bf[ne].nxt = head[y];
        head[y] = ne++;
    }
    typec flow(int n, int s, int t) {
        typec tr, res = 0;
        int i, j, k, f, r, top;
        while (1) {
            memset(dep, -1, n * sizeof(int));
            for (f = dep[ps[0] = s] = 0, r = 1; f != r;) {
                for (i = ps[f++], j = head[i]; j; j = bf[j].nxt) {
                    if (bf[j].c && -1 == dep[k = bf[j].y]) {
                        dep[k] = dep[i] + 1;
                        ps[r++] = k;
                        if (k == t) {
                            f = r;
                            break;
                        }
                    }
                }
            }
            if (-1 == dep[t]) {
                break;
            }
            memcpy(cur, head, n * sizeof(int));
            for (i = s, top = 0;;) {
                if (i == t) {
                    for (k = 0, tr = inf; k < top; ++k) {
                        if (bf[ps[k]].c < tr) {
                            tr = bf[ps[f = k]].c;
                        }
                    }
                    for (k = 0; k < top; k++) {
                        bf[ps[k]].c -= tr, bf[ps[k] ^ 1].c += tr;
                    }
                    res += tr;
                    i = bf[ps[top = f]].x;
                }
                for (j = cur[i]; cur[i]; j = cur[i] = bf[cur[i]].nxt) {
                    if (bf[j].c && dep[i] + 1 == dep[bf[j].y]) {
                        break;
                    }
                }
                if (cur[i]) {
                    ps[top++] = cur[i];
                    i = bf[cur[i]].y;
                } else {
                    if (0 == top) {
                        break;
                    }
                    dep[i] = -1;
                    i = bf[ps[--top]].x;
                }
            }
        }
        return res;
    }
    int graph[MAXCUR][MAXCUR];
    void Floyd(int N) {
        int i, j, k;
        for (k = 0; k < N; k++) {
            for (i = 0; i < N; i++) {
                for (j = 0; j < N; j++) {
                    if(graph[i][k] < graph[i][j] - graph[k][j]) {
                        graph[i][j] = graph[i][k] + graph[k][j];
                    }
                }
            }
        }
    }
    int work() {
        char str[100], str2[100];
        map<string, int> mymap;
        int n, m, k, curnamenum;
        ne = 2;
        memset(head, 0, sizeof(head));
        scanf("%d", &n);
        for(int i = 1; i <= n; i++) {
            addedge(0, i, 1);
            scanf("%s", str);
            mymap[string(str)] = i;
        }
        curnamenum = n;
        scanf("%d", &m);
        for(int i = 0; i < m; i++) {
            addedge(PY + i, END, 1);
            scanf("%s%s", str2, str);
            if(mymap.find(string(str)) == mymap.end()) {
                mymap[string(str)] = ++curnamenum;
            }
            addedge(mymap[string(str)], PY+ i, 1);
        }
        scanf("%d", &k);
        fill_n(*graph, MAXCUR * MAXCUR, inf);
        for(int i = 0; i < MAXCUR; i++) {
            graph[i][i] = 0;
        }
        for(int i = 0; i < k; i++) {
            scanf("%s%s", str, str2);
            if(mymap.find(string(str)) == mymap.end()) {
                mymap[string(str)] = ++curnamenum;
            }
            if(mymap.find(string(str2)) == mymap.end()) {
                mymap[string(str2)] = ++curnamenum;
            }
            int b = mymap[string(str)];
            int a = mymap[string(str2)];
            graph[a - 1][b - 1] = 1;
        }
        Floyd(curnamenum);
        for(int i = 1; i <= curnamenum; i++) {
            for(int j = 1; j <= curnamenum; j++) {
                if(i != j && graph[i - 1][j - 1] < inf) {
                    addedge(i, j, inf);
                }
            }
        }
        return m - flow(END + 1, 0, END);
    }
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("data.in", "r", stdin);
    #endif
        int T;
        scanf("%d", &T);
        while(T--) {
            printf("%d\n", work());
            if(T) {
                putchar('\n');
            }
        }
        return 0;
    }
  • 相关阅读:
    @JsonFormat和@DateTimeFormat
    13位时间戳和时间格式化转换,工具类
    springboot配置hibernate jpa多数据源
    Mysql向数据库插入数据时,判断是否存在,若不存在就插入数据
    服务器启动完成执行定时任务Timer,TimerTask
    java中服务器启动执行定时任务
    Java定时任务
    阿里大鱼短信发送,放到项目中报错Java.lang.NoClassDefFoundError:com/aliyuncs/exceptions/ClientException,已解决
    MD5加密(相同的字符串,每次加密后的密文是相同的)
    常见的集中加密方法BASE64、MD5、SHA、HMAC
  • 原文地址:https://www.cnblogs.com/moonbay/p/2847655.html
Copyright © 2020-2023  润新知