A Plug for UNIX(最大流)

题目链接点击这里
                                                                                A Plug for UNIX
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 16517 Accepted: 5676

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

题解直接看这里

点击打开链接

代码

#include <iostream>
#include <string.h>
#include <string>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m, t;
int c[505][505];
int level[505];
int S, T;
map<string, int> mp;

int bfs()
{
    memset(level, -1, sizeof(level));
    queue<int> q;
    while(!q.empty()) q.pop();
    level[S] = 0;
    q.push(S);
    while(!q.empty()){
        int tmp = q.front();
        q.pop();
        for(int i = S; i <= T; i++){
            if(i == tmp) continue;
            if(c[tmp][i] > 0 && level[i] == -1){
                level[i] = level[tmp] + 1;
                q.push(i);
            }
        }
    }
    return level[T] != -1;//等于-1的话就说明已经没有可增广路径
}

int dfs(int u, int f)
{
    if(u == T) return f;
    for(int i = S; i <= T; i++){
       if(u == i) continue;
        if(c[u][i] > 0 && level[i] == level[u] + 1){
            int tmp = dfs(i, min(f, c[u][i]));
            if(tmp > 0){
                c[u][i] -= tmp;
                c[i][u] += tmp;
                return tmp;
            }
        }
    }
    level[u] = -1;
    return 0;
}

int solve()
{
    int ans = 0, tmp;
    while(bfs()){
        while((tmp = dfs(S, inf)) > 0){
            ans += tmp;
        }
    }
    return m - ans;
}

int main()
{
    memset(c, 0, sizeof(c));
    string s1, s2;
    cin >> n;
    for(int i = 1; i <= n; i++){//插座
        cin >> s1;//插座型号
        mp[s1] = i;
    }
    int k = n;
    cin >> m;
    for(int i = 1; i <= m; i++){//设备
        cin >> s1;//设备名
        cin >> s2;//设备型号
        if(mp.find(s2) == mp.end()){//如果这个型号没有出现过
            mp[s2] = ++k;
        }
        c[i][m+mp[s2]] = 1;
    }
    cin >> t;
    for(int i = 1; i <= t; i++){
        cin >> s1;
        cin >> s2;
        if(mp.find(s1) == mp.end())
            mp[s1] = ++k;
        if(mp.find(s2) == mp.end())
            mp[s2] = ++k;
        c[m+mp[s1]][m+mp[s2]] = inf;
    }
    S = 0, T = m + k + 1;
    for(int i = 1; i <= m ; i++)
        c[S][i] = 1;
    for(int i = 1; i <= n; i++)
        c[m+i][T] = 1;
    cout << solve() << endl;
    return 0;
}



CFNet是一个插拔式的目标检测的主干网络,它能够有效地处理目标检测任务。目标检测是计算机视觉领域中的一个重要任务,它涉及到从图像或视频中识别和定位不同物体的能力。 CFNet的设计理念是将主干网络设计成一个可插拔的组件,使得研究者和开发者可以根据自己的需求和具体任务进行定制。这种设计的好处是,它不仅能够提供高效的目标检测性能,而且可以灵活地适应各种不同的应用场景。例如,当需要进行实时的目标检测时,可以使用轻量级的CFNet进行快速推理;当需要进行高精度的目标检测时,可以选择更加复杂的CFNet进行训练和推理。 CFNet采用了一种特殊的架构来实现目标检测。它结合了多尺度特征图的信息,并使用了一种称为Anchor的机制来生成候选框。然后,它通过分类和回归分支来对候选框进行检测和定位。这种设计可以有效地提高目标检测的准确性和效率。 CFNet还具有良好的可扩展性和泛化能力。它可以在不同的数据集上进行训练,并且可以通过微调等方法进一步提高性能。此外,CFNet还支持一些常见的目标检测任务,如目标跟踪和实例分割。 综上所述,CFNet是一个插拔式的目标检测主干网络,它通过灵活的设计和架构来实现高效准确的目标检测任务。它在计算机视觉领域具有广泛的应用前景,可以用于各种不同的目标检测任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值