【codechef】 Special Economic Zone(二分图匹配,难想到)

本文深入探讨了一个涉及匹配理论的问题,通过将道路视为需求关系,解释了如何通过DFS算法找到匹配最优解。文章详细阐述了解题思路、原理与实现,旨在帮助读者理解抽象问题的具体应用。

  • Input:
    6 5
    1 2
    2 3
    4 5
    5 6
    6 4
    
    Output:
    1
    

    Explanation

    Ciel will select city 1 and 3 as SEZ. So x = 2 (city 1 and 3), y = 1 (city 2), x - y = 1.

    http://www.codechef.com/MAY15/problems/SEZ/

    方法真的很难想到!想到就容易做了!

    原理其实和这道题目一样:http://blog.youkuaiyun.com/cacyth/article/details/48174383

    比较难想到的是,这道题目中的每一条道路都要被抽象理解成上一题的需求,比如a和b直接有一条道路,那么就要理解成:a想要b的书,b想要a的书。然而一个开心城市只能匹配一个不开心城市,一个不开心城市只能匹配一个开心城市,所以必会有一部分开心/不开心城市落单。因为开心和不开心是相对的,所以我们可以理解成那些落单的都是开心城市。题目要求的x-y也就是这个!

#include <bits/stdc++.h>
using namespace std;
#define REP(a, b, c) for(int a = b; a < c; a++)
#define asd(x)              cout<<__LINE__<<" :: "<<#x<< ": "<<x<<endl;
#define asdf(x, y)          cout<<__LINE__<<" :: "<<#x<< ": "<<x<<" | "<<#y<< ": "<<y<<endl;
typedef pair<int,int> ii;
typedef long long LL;
 
const int MAX = 201;
 
int vis[MAX], booked[MAX];
vector<int> G[MAX];
 
bool dfs(int x){
    REP(i, 0, G[x].size()){
        int u = G[x][i];
        if(vis[u]) continue;
        int t = booked[u];
        booked[u] = x;
        vis[u] = true;
        if(t == -1 || dfs(t)) return true;
        booked[u] = t;
    }
    return false;
}
 
 
int main(){
    int n, m;
    cin >> n >> m;
    REP(i, 0, m){
        int a, b;
        cin >> a >> b;
        G[a].push_back(b);
        G[b].push_back(a);
    }
 
    int ans = n;
    memset(booked, -1, sizeof booked);
    REP(i, 1, n+1){
        memset(vis, 0, sizeof vis);
        if(dfs(i)){
            ans--;
        }
    }
 
    cout << ans << endl;
    return 0;
} 

Special attention module 是一种基于注意力机制的模块,广泛应用于深度学习模型中,特别是在自然语言处理(NLP)和计算机视觉(CV)任务中。该模块的核心目标是让模型能够自动关注输入数据中的关键部分,从而提升模型的性能和解释性。 ### 工作原理 Special attention module 的工作原理通常包括以下几个关键步骤: 1. **输入表示**:将输入数据(如文本、图像等)转换为向量形式。例如,在自然语言处理中,输入文本可以通过嵌入层转换为词向量。 2. **注意力权重计算**:通过一个可学习的参数矩阵,计算每个输入元素的重要性。注意力权重通常通过 softmax 函数归一化,以确保它们的和为 1。 3. **加权求和**:使用计算出的注意力权重对输入向量进行加权求和,得到一个上下文向量(context vector),该向量集中了输入数据中最相关的信息。 4. **输出生成**:将上下文向量输入到后续的网络层中,用于完成具体的任务,如分类、生成或预测。 ### 流程图设计 以下是一个典型的 Special attention module 的流程图设计示意图,展示了模块内部的数据流动和计算过程: ``` +----------------+ +---------------------+ +-------------------+ +-----------------+ | 输入数据 (X) | ---> | 注意力权重计算 (A) | ---> | 加权求和 (C) | ---> | 输出 (Context) | +----------------+ +---------------------+ +-------------------+ +-----------------+ ``` 1. **输入数据 (X)**:输入数据可以是文本、图像或其他形式的数据,通常表示为一个向量序列。 2. **注意力权重计算 (A)**:通过可学习的参数计算每个输入元素的注意力权重。例如,可以使用一个神经网络层来实现。 3. **加权求和 (C)**:根据注意力权重对输入数据进行加权求和,生成一个上下文向量。 4. **输出 (Context)**:上下文向量将作为后续任务的输入,用于进一步的处理。 ### 数学公式 Special attention module 的核心公式可以表示为: 1. **注意力权重计算**: $$ \alpha_i = \text{softmax}(W \cdot h_i + b) $$ 其中,$ h_i $ 是第 $ i $ 个输入元素的表示,$ W $ 和 $ b $ 是可学习的参数,$ \alpha_i $ 是第 $ i $ 个输入元素的注意力权重。 2. **上下文向量计算**: $$ c = \sum_{i} \alpha_i \cdot h_i $$ 其中,$ c $ 是最终的上下文向量,表示输入数据中最重要的信息。 ### 示例代码 以下是一个简单的 Python 代码示例,展示了如何实现一个基本的注意力模块: ```python import torch import torch.nn as nn import torch.nn.functional as F class AttentionModule(nn.Module): def __init__(self, input_dim): super(AttentionModule, self).__init__() self.attention_weights = nn.Linear(input_dim, 1) def forward(self, x): # x: 输入数据,形状为 (batch_size, sequence_length, input_dim) attention_scores = self.attention_weights(x) # 形状为 (batch_size, sequence_length, 1) attention_weights = F.softmax(attention_scores, dim=1) # 归一化 context_vector = torch.sum(attention_weights * x, dim=1) # 加权求和 return context_vector # 示例使用 input_dim = 64 sequence_length = 10 batch_size = 32 # 随机生成输入数据 x = torch.randn(batch_size, sequence_length, input_dim) # 初始化注意力模块 attention_module = AttentionModule(input_dim) # 计算上下文向量 context_vector = attention_module(x) print(context_vector.shape) # 输出形状为 (batch_size, input_dim) ``` 通过上述流程图设计和代码示例,可以清晰地理解 Special attention module 的工作原理及其在深度学习模型中的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值