CH6802车的放置(二分图最大匹配)

题    目    传    送    门    在    这


 题目大意

题目都很简短了就不说了……(懒得打)

解题思路

我们把行和列都看作节点,对于每个可以放位置,连一条行到列的边。

我们发现这是一个二分图。

因为车不能互相攻击,对于第一行,只能放一个车,对于每一列也是如此,所以每个节点只有一条连边。

那么就符合二分图匹配中每两条边没有公共节点。

本题就变成求二分图最大匹配的题目。

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define rep(x, l, r) for(int x = l; x <= r; x++)
#define repd(x, r, l) for(int x = r; x >= l; x--)
#define clr(x, y) memset(x, y, sizeof(x))
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define MAXN 105
#define MAXM 40005
#define fi first
#define se second
#define SZ(x) ((int)x.size())
using namespace std;
typedef long long LL;
typedef vector<int> vi;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int p = 10000007;
int lowbit(int x){ return x & -x; }
int fast_power(int a, int b){ int x; for(x = 1; b; b >>= 1){ if(b & 1) x = 1ll * x * a % p; a = 1ll * a * a % p; } return x; }

const int dic[4][2] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
int n, m, cnt;
int head[MAXN * MAXN], nxt[MAXM], to[MAXM];
int match[MAXN * MAXN];
bool g[MAXN][MAXN], vis[MAXN * MAXN];

void init(){
    cnt = 0;
    clr(head, -1);
    clr(match, 0);
}

int id(int x, int y){
    return (x - 1) * n + y;
}

void add(int u, int v){
    nxt[cnt] = head[u];
    head[u] = cnt;
    to[cnt] = v;
    cnt++;
}

bool dfs(int u){
    for(int e = head[u]; e != -1; e = nxt[e]){
        int v = to[e];
        if(vis[v]) continue;
        vis[v] = 1;
        if(!match[v] || dfs(match[v])){
            match[v] =  u;
            return 1;
        }
    }
    return 0;
}

int main(){
    init();
    scanf("%d%d", &n, &m);
    rep(i, 1, m){
        int x, y;
        scanf("%d%d", &x, &y);
        g[x][y] = 1;
    }
    rep(i, 1, n)
        rep(j, 1, n)
            if(!g[i][j])
                rep(k, 0, 3){
                    int x = i + dic[k][0], y = j + dic[k][1];
                    if(x > 0 && y > 0 && x <= n && y <= n && !g[x][y] && (x + y) % 2){
                        add(id(i, j), id(x, y));
                    }
                }
    int ans = 0;
    rep(i, 1, id(n, n)){
        clr(vis, 0);
        if(dfs(i)) ans++;
    }
    printf("%d\n", ans);
    return 0;
}

最后问一下,为什么mac自带输入法打不出“車”。 

转载于:https://www.cnblogs.com/SHANAchan/p/10343494.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CH340G隔离电路图是一种常用的USB转串口芯片的隔离电路设计方案。CH340G是一款集成了USB转串口功能的芯片,具有独立的供电电源和信号数据的隔离功能,能够解决电气隔离和信号隔离的问题。以下是一种常见的CH340G隔离电路图设计。 整个电路由两部分组成,分别是电脑端和外部设备端。 电脑端的部分由USB供电电源和CH340G芯片组成,用来将电脑端的USB接口转换成串口通信接口。在CH340G芯片的电源部分,通过隔离电源模块将电脑端的电源与外部设备端的电源隔离开来,以避免电气干扰和传输噪声。 外部设备端的部分由CH340G芯片和串口通信接口组成,用来与外部设备进行串口通信。在这个部分,通过隔离数据传输模块将电脑端与外部设备端之间的信号数据进行隔离,以实现信号隔离和抗干扰能力。 同时,为了实现电气隔离和信号隔离的效果,还需要在电路中加入相应的隔离元器件,如光耦和隔离变压器等。光耦用于隔离数据的传输,隔离变压器则用于隔离电源的供应。 综上所述,CH340G隔离电路图是一种用于USB转串口应用的电路设计方案,通过隔离电源和隔离信号数据的方式,实现了电气隔离和信号隔离的效果,提供稳定可靠的串口通信功能。 ### 回答2: CH340G是一种USB转TTL串口芯片,用于将计算机的USB接口信号转换为适合串口通信的信号。CH340G隔离电路图是指在CH340G芯片的周围设计的电路图,用于提供电气隔离保护。 CH340G隔离电路图通常包括以下几个部分: 1. 电源隔离:为了提供电气隔离保护,隔离电路图会将计算机的USB电源和转换后的电源分别隔离开来,避免干扰和电气冲击。 2. 信号隔离:为了避免电气噪声和干扰,隔离电路图会使用隔离器件将计算机的USB信号和转换后的串口信号隔离开来,保证数据传输的稳定性和可靠性。 3. 过电流保护:隔离电路图还会增加过电流保护电路,用于检测和保护CH340G芯片及其周边设备免受过电流的损害。 4. ESD保护:对于静电放电等环境因素,隔离电路图会增加防静电保护电路,用于保护CH340G芯片免受静电干扰和损坏。 总的来说,CH340G隔离电路图的设计目的是为了提供电气隔离保护,保证数据传输的稳定性和可靠性。在具体的应用中,设计者还会根据需求考虑其他因素,如信号质量、电气安全等,以确保CH340G芯片的正常工作和可靠性传输。 ### 回答3: CH340G是一款常见的USB转UART芯片,它的隔离电路图主要包括以下几个部分: 1. USB接口部分:CH340G芯片的一侧连接USB接口,用于与计算机进行通信。该接口包括D+、D-、VCC、GND等引脚,可以实现USB数据传输和供电功能。 2. 逻辑电平转换部分:CH340G芯片能够将计算机发送的逻辑电平转换为串行数据信号。在隔离电路图中,逻辑电平转换部分包含一个电平翻转电路和一个逻辑电平转换电路。该部分能够将计算机发送的逻辑高电平转换为串行数据中的高电平,逻辑低电平转换为串行数据中的低电平,以实现数据的传输。 3. 隔离电路部分:为了防止电气噪音、干扰等问题,CH340G隔离电路图中有一个隔离电路部分。该部分包含一个隔离器件,一般为光耦,能够将输入信号与输出信号进行隔离,以提高传输的稳定性和可靠性。 4. 串行通信部分:CH340G芯片在接收到UART数据后,通过内部的串行通信控制电路将数据进行处理,如进行校验、解码等操作。然后将处理后的数据通过输出引脚发送给相应的外设。 总之,CH340G隔离电路图主要包括USB接口部分、逻辑电平转换部分、隔离电路部分和串行通信部分等组成部分,能够实现USB转UART的功能,并且通过隔离电路部分提高传输的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值