POJ1087 A Plug for UNIX(网络流)

A Plug for UNIX

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 16083   Accepted: 5513

Description

You are in charge of setting up the press room for the inaugural meeting of the United Nations Internet eXecutive (UNIX), which has an international mandate to make the free flow of information and ideas on the Internet as cumbersome and bureaucratic as possible.
Since the room was designed to accommodate reporters and journalists
from around the world, it is equipped with electrical receptacles to
suit the different shapes of plugs and voltages used by appliances in
all of the countries that existed when the room was built.
Unfortunately, the room was built many years ago when reporters used
very few electric and electronic devices and is equipped with only one
receptacle of each type. These days, like everyone else, reporters
require many such devices to do their jobs: laptops, cell phones, tape
recorders, pagers, coffee pots, microwave ovens, blow dryers, curling

irons, tooth brushes, etc. Naturally, many of these devices can
operate on batteries, but since the meeting is likely to be long and
tedious, you want to be able to plug in as many as you can.

Before the meeting begins, you gather up all the devices that the
reporters would like to use, and attempt to set them up. You notice that
some of the devices use plugs for which there is no receptacle. You
wonder if these devices are from countries that didn‘t exist when the
room was built. For some receptacles, there are several devices that use
the corresponding plug. For other receptacles, there are no devices
that use the corresponding plug.

In order to try to solve the problem you visit a nearby parts supply
store. The store sells adapters that allow one type of plug to be used
in a different type of outlet. Moreover, adapters are allowed to be
plugged into other adapters. The store does not have adapters for all
possible combinations of plugs and receptacles, but there is essentially
an unlimited supply of the ones they do have.

Input

The
input will consist of one case. The first line contains a single
positive integer n (1 <= n <= 100) indicating the number of
receptacles in the room. The next n lines list the receptacle types
found in the room. Each receptacle type consists of a string of at most
24 alphanumeric characters. The next line contains a single positive
integer m (1 <= m <= 100) indicating the number of devices you
would like to plug in. Each of the next m lines lists the name of a
device followed by the type of plug it uses (which is identical to the
type of receptacle it requires). A device name is a string of at most 24
alphanumeric

characters. No two devices will have exactly the same name. The plug
type is separated from the device name by a space. The next line
contains a single positive integer k (1 <= k <= 100) indicating
the number of different varieties of adapters that are available. Each
of the next k lines describes a variety of adapter, giving the type of
receptacle provided by the adapter, followed by a space, followed by the
type of plug.

Output

A line containing a single non-negative integer indicating the smallest number of devices that cannot be plugged in.

Sample Input

4
A
B
C
D
5
laptop B
phone C
pager B
clock B
comb X
3
B X
X A
X D 

Sample Output

1【题意】有n个插座,m个电器,每个电器都对应一个插头,k个转换器,s1 s2表示插座s2可以转换成s1, 开始提供的插座只有一个插口,转换器有无数个,问最少有几个电器无法使用。【分析】这就是个最大流问题,关键在于建图。定义一个超级源点,超级汇点,源点指向n个插座,电器 指向汇点,插座指向对应的电器,容量均为1,s2指向s1,容量为无穷大,Dinic求最大流。还有就是 这个题目数据范围有问题,定105RE,后看讨论改的805.

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define inf 0x3f3f3f3f
#define mod 10000
typedef long long ll;
using namespace std;
const int N=805;
const int M=300005;
int power(int a,int b,int c){int ans=1;while(b){if(b%2==1){ans=(ans*a)%c;b--;}b/=2;a=a*a%c;}return ans;}
struct man
{
    int c,f;
}w[N][N];
int dis[N],n,m,k;
int s,ans,cnt;
int link;
map<string,int>p;
bool bfs()
{
    queue<int>q;
    memset(dis,0,sizeof(dis));
    q.push(s);
    dis[s]=1;
    while(!q.empty()){
        int v=q.front();q.pop();
        for(int i=0;i<=cnt;i++){
            if(!dis[i]&&w[v][i].c>w[v][i].f){
                q.push(i);
                dis[i]=dis[v]+1;
            }
        }
        if(v==1) return true;
    }
    return false;
}
int dfs(int cur,int cp)
{
    if(cur==1)return cp;
    int tmp=cp,tt;
    for(int i=0;i<=cnt;i++){
        if(dis[i]==dis[cur]+1 && tmp &&w[cur][i].c>w[cur][i].f){
            tt=dfs(i,min(w[cur][i].c-w[cur][i].f,tmp));
            w[cur][i].f+=tt;
            w[i][cur].f-=tt;
            tmp-=tt;
        }
    }
    return cp-tmp;
}
void dinic()
{
    ans=0;
    while(bfs())ans+=dfs(s,inf);
}
int main(){

    string str,_str;
    while(~scanf("%d",&n)){
        memset(w,0,sizeof(w));
        p.clear();
        cnt=1;
        s=0;

        while(n--){
            cin>>str;
            p[str]=++cnt;
            w[0][p[str]].c=1;
        }
        cin>>m;
        int M=m;
        while(m--){
            cin>>str>>_str;
            p[str]=++cnt;
            if(!p[_str])p[_str]=++cnt;
            w[p[str]][1].c=1;
            w[p[_str]][p[str]].c=1;
        }
        cin>>k;
        while(k--){
            cin>>str>>_str;
            if(!p[str])p[str]=++cnt;
            if(!p[_str])p[_str]=++cnt;
            w[p[_str]][p[str]].c=inf;
        }

        dinic();
        cout<<M-ans<<endl;
    }
    return 0;
}

时间: 2024-10-12 15:37:51

POJ1087 A Plug for UNIX(网络流)的相关文章

POJ 1087 A Plug for UNIX(网络流之最大流)

题目地址:POJ 1087 不知道是谁把这题化为了二分最大匹配的专题里..于是也没多想就按照二分图的模型来建的(虽然当时觉得有点不大对...).后来发现二分最大匹配显然不行..有权值..直接来个最大流多方便..然后一直WA..后来仔细想了想..这根本就不能建二分图啊....这题跟二分图一点关系都没有.... 这题的建图思路是让源点与每一个设备的插座类型连边,让汇点与每一个插座连边.然后用floyd判断该设备能否通过转换转换成可以插的插座上.只要可以转换成的就连边,权值为INF.然后求一次最大流,

POJ1087_A Plug for UNIX(网络流最大流)

解题报告 题意: n个插头m个设备k种转换器.求有多少设备无法插入. 思路: 定义源点和汇点,源点和设备相连,容量为1. 汇点和插头相连,容量也为1. 插头和设备相连,容量也为1. 可转换插头相连,容量也为inf(因为插头有无限个) #include <map> #include <queue> #include <cstdio> #include <vector> #include <cstring> #include <iostream

uva753 A Plug for UNIX 网络流最大流

C - A Plug for UNIX    You are in charge of setting up the press room for the inaugural meeting of the United Nations Internet eXecutive (UNIX), which has an international mandate to make the free flow of information and ideas on the Internet as cumb

POJ1087:A Plug for UNIX(最大流)

A Plug for UNIX 题目链接:https://vjudge.net/problem/POJ-1087 Description: You are in charge of setting up the press room for the inaugural meeting of the United Nations Internet eXecutive (UNIX), which has an international mandate to make the free flow o

POJ1087 A Plug for UNIX 【最大流】

A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13855   Accepted: 4635 Description You are in charge of setting up the press room for the inaugural meeting of the United Nations Internet eXecutive (UNIX), which has an int

poj1087 A Plug for UNIX(网络流最大流)

http://poj.org/problem?id=1087 好久没遇见过这么坑的题了这个题真是挫的够可以的.题目大意:你作为某高管去住宿了,然后宾馆里有几种插座,分别有其对应型号,你携带了几种用电器(手机,电脑一类的), 也有其对应型号:可是不一定用电器就能和插座匹配上,于是宾馆的商店里提供了一些转换器,这些转换器可以将某一型号电源转换成另一型号的.问,你的用电器最少会有多少种无 法充电.也就是问可以用上电的用电器的最大数目,之后用电器总数减去此可用电最大数目即可得到最小不能用电数目. 一开始

POJ - 1087 A Plug for UNIX (网络流)

原题链接 题意: 给定 N 个不同类型插座,每个插座只能插一个相对应的设备 : 现有 M 个人,给出每个人名字和设备的插头类型,然后给定 K 种转换器,每种转换器的数量都是无限的,每种转化器描述为: 插座类型,插头类型: 现在问至少有多少个人的设备无法插入. 思路: 一个典型的最大流问题,设定超级源点 S , 超级汇点 T ,将每种插座与 S 相连,流量为1:将所有人的插头类型统计一下,并记录数量,然后将其与汇点相连,流量为每种插头的数量: 记录所有的转换器,用 Floyd 算出 每种插头最终可

POJ 1087 A Plug for UNIX 会议室插座问题 构图+最大流

题目链接:POJ 1087 A Plug for UNIX A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13809   Accepted: 4623 Description You are in charge of setting up the press room for the inaugural meeting of the United Nations Internet eXec

POJ 1087 A Plug for UNIX (最大流)

A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K       Description You are in charge of setting up the press room for the inaugural meeting of the United Nations Internet eXecutive (UNIX), which has an international mandate to make the free