• poj1087 A Plug for UNIX ***


    /*
    * 1087.cpp
    * 第一道最大流题目, 看了网上的解法,
    *
    http://www.cppblog.com/NARUTOACM/archive/2010/03/01/108680.html
    *
    见图:



    其实可以把图中的边的方向全部反过来,就可以这样理解:T是总电源, 单位时间内可以给A、B、C、D提供1度电(ABCD是原来就有的电源插座),
      而根据每个设备的插座类型, 相应的插座能给设备提供1度电.。S看做总的消耗功率。。每个设备对总消耗功率的贡献是1.。
      至于adapter, 由于每种adapter有无限个, 所以 例如 把 X 变成 B 的adapter,相当于X能为B提供无限的电。。。

     *
    *
    *假设device的个数为m, plug的种数为t,则所有顶点的标号:
    * S : 0; device: 1 ~ m; plug: m+1 ~ m+t; T: m+t+1;
    *
    *
    *
    */
    #include
    <iostream>
    #include
    <string>
    #include
    <cstring>
    #include
    <map>
    #include
    <queue>
    using namespace std;

    const int inf = 100000000;
    const int maxN = 500 + 5;
    int n, m, k, c[maxN][maxN]={}, S, T, pre[maxN], maxFlow = 0;
    map
    <string, int> M; //用来计算plug的种数,从而编号
    queue<int> Q;

    void addFlow(int d){
    int cur = T;
    while(cur != S){
    c[pre[cur]][cur]
    -= d;
    c[cur][pre[cur]]
    += d;

    cur
    = pre[cur];
    }

    maxFlow
    += d;
    }


    void fulk(){
    while(true){
    //广搜找增广路径

    //队列初始化
    while(!Q.empty())
    Q.pop();
    Q.push(S);
    memset(pre,
    -1, sizeof(pre)); //前驱子图

    while(!Q.empty()){
    int head = Q.front(); Q.pop();
    for(int i=0; i<=T; i++){
    if(c[head][i] != 0 && pre[i] == -1){
    pre[i]
    = head;
    Q.push(i);
    }
    }
    if(pre[T] != -1) break; //找到了增广路径
    }
    if(pre[T] == -1) return;
    else addFlow(1);
    }
    }


    int main(){
    //建图
    string plug, device;

    cin
    >> n;
    for(int i=1; i<=n; i++){
    cin
    >> plug;
    M[plug]
    = i;
    }

    int t = n;
    cin
    >> m;
    for(int i=1; i<=m; i++){
    cin
    >> device >> plug;
    if(M.find(plug) == M.end())
    M[plug]
    = ++t;
    c[i][m
    + M[plug]] = 1;
    }

    string plug1, plug2;
    cin
    >> k;
    for(int i=1; i<=k; i++){
    cin
    >> plug1 >> plug2;
    if(M.find(plug1) == M.end())
    M[plug1]
    = ++t;
    if(M.find(plug2) == M.end())
    M[plug2]
    = ++t;

    c[m
    + M[plug1]][m + M[plug2]] = inf;
    }

    S
    = 0, T = m + t + 1;
    for(int i=1; i<=m; i++)
    c[S][i]
    = 1;
    for(int i=1; i<=n; i++)
    c[m
    +i][T] = 1;


    //最大流算法
    fulk();

    cout
    << m - maxFlow << endl;



    return 0;
    }
  • 相关阅读:
    HDU5873
    HDU5874
    HDU1565(状态压缩dp)
    POJ2774(二分+哈希)
    HDU4474
    HDU2602(背包)
    单链表
    POJ2503(hash)
    POJ1200(hash)
    顺序表
  • 原文地址:https://www.cnblogs.com/longdouhzt/p/2165860.html
Copyright © 2020-2023  润新知