• POJ1087 A Plug of UNIX


    你作为某高管去住宿了,然后宾馆里有几种插座,分别有其对应型号,你携带了几种用电器(手机,电脑一类的),也有其对应型号;可是不一定用电器就能和插座匹配上,于是宾馆的商店里提供了一些转换器,这些转换器可以将某一型号电源转换成另一型号的。问,你的用电器最少会有多少种无法充电 

    源点向电器连边,容量为1,电器向对应的插座连边,容量为1,于转换器,在插座与插座之间连边,容量为inf,所有插座向汇点连边,容量为插座的个数~

    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<map>
    #include<iostream>
    #include<string>
    using namespace std;
    const int maxn=1014;
    const int inf=1e9;
    queue<int> q;
    int n;
    int g[maxn][maxn];
    int pre[maxn];
    int flow[maxn];
    int maxflow;
    int bfs (int s,int t) {
        while (!q.empty()) q.pop();
        for (int i=0;i<=n;i++) pre[i]=-1;
        pre[s]=0;
        q.push(s);
        flow[s]=inf;
        while (!q.empty()) {
            int x=q.front();
            q.pop();
            if (x==t) break;
            for (int i=0;i<=n;i++) 
            if (g[x][i]>0&&pre[i]==-1) {
                pre[i]=x;
                flow[i]=min(flow[x],g[x][i]);
                q.push(i);
            }
        }
        if (pre[t]==-1) return -1;
        else return flow[t];
    }
    void Edmonds_Karp (int s,int t) {
        int increase=0;
        while ((increase=bfs(s,t))!=-1) {
            int k=t;
            while (k!=s) {
                int last=pre[k];
                g[last][k]-=increase;
                g[k][last]+=increase;
                k=last;
            }
            maxflow+=increase;
        }
    }
    map<string,int> pos;
    int main () {
        string s1,s2;
        int N,M,cnt,st,ed;
        while (~scanf("%d",&N)) {
            pos.clear();
            memset(g,0,sizeof(g));
            maxflow=0;
            st=0;
            ed=1;
            cnt=2;
            while (N--) {
                cin>>s1;
                pos[s1]=cnt;
                g[0][cnt++]=1;
            }
            scanf ("%d",&M);
            for (int i=0;i<M;i++) {
                cin>>s1>>s2;
                if (pos[s1]==0) pos[s1]=cnt++;
                if (pos[s2]==0) pos[s2]=cnt++;
                g[pos[s1]][ed]=1;
                g[pos[s2]][pos[s1]]=1;
            }
            scanf ("%d",&N);
            while (N--) {
                cin>>s1>>s2;
                if (pos[s1]==0) pos[s1]=cnt++;
                if (pos[s2]==0) pos[s2]=cnt++;
                g[pos[s2]][pos[s1]]=inf;
            }
            n=cnt-1;
            Edmonds_Karp (st,ed);
            printf ("%d
    ",M-maxflow); 
        }
        return 0;
    }
  • 相关阅读:
    session笔记-韩顺平
    带宽
    cookie-韩顺平
    分层模式开发+MVC模式开发--韩顺平雇员数据库管理
    韩顺平-雇员管理系统-学习小结
    常用的PHP数据库操作方法(MYSQL版)
    使用Three.js 基本组件以及流程
    three.js 相机
    多线程的操作与数据绑定
    矩阵-
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12316110.html
Copyright © 2020-2023  润新知