二分图的最大匹配经典例题 hdu4185

本文介绍了一种基于图的匹配算法实现,通过构建图结构并利用匈牙利算法求解最大匹配问题,解决特定场景下的配对需求。文章详细展示了算法的具体实现过程,包括节点连接、边的创建以及匹配寻找等关键步骤。
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"vector"
using namespace std;
#define N 605
#define M 6005
vector<int>g[M];
int id[N][N],cnt;
int mark[M],link[M];
int dir[4][2]={0,1,0,-1,-1,0,1,0};
char str[N][N];
int find(int k)
{
    int i;
    for(i=0;i<g[k].size();i++)
    {
        int v=g[k][i];
        if(!mark[v])
        {
            mark[v]=1;
            if(link[v]==-1||find(link[v]))
            {
                link[v]=k;
                return 1;
            }
        }
    }
    return 0;
}
int solve(int n)
{
    int i,ans=0;
    memset(link,-1,sizeof(link));
    for(i=0;i<n;i++)
    {
        memset(mark,0,sizeof(mark));
        ans+=find(i);
    }
    return ans;
}
int main()
{
    int i,j,n,T,cas=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        cnt=0;
        for(i=0;i<n;i++)
        {
            scanf("%s",str[i]);
            for(j=0;j<n;j++)
            {
                if(str[i][j]=='#')
                {
                    id[i][j]=cnt++;
                }
            }
        }
        for(i=0;i<M;i++)
            g[i].clear();
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                int x,y,u,v,k;
                if(str[i][j]=='.')
                    continue;
                u=id[i][j];
                for(k=0;k<4;k++)
                {
 
                    x=dir[k][0]+i;
                    y=dir[k][1]+j;
                    if(x>=0&&x<n&&y>=0&&y<n&&str[x][y]=='#')
                    {
                        v=id[x][y];
                        g[u].push_back(v);
                        g[v].push_back(u);
                    }
                }
            }
        }
        int ans=solve(cnt);
        printf("Case %d: %d\n",cas++,ans/2);     //每条边建了两次,除以2
    }
    return 0;
}
<think>好的,用户现在想了解注意力机制的基础概念和简单解释,而且要通俗易懂。之前他们提供了两篇引用,分别是关于Self-Attention和Transformer,以及SE模块的结构。不过用户提到这些引用仅供参考,需要更多地参考上一次的问题和回答。 首先,回顾用户的上一次问题,他们需要一份三维点云配准技术的综述,分三个阶段,每个阶段的算法创新和不足。我的回答里提到了传统方法、优化算法和特征学习阶段,包括ICP、GMM、深度学习等方法,以及相关的数学公式和代码示例。现在用户转向注意力机制,可能是在学习深度学习中的相关内容,尤其是点云处理中的注意力应用,比如Transformer在点云中的应用。 用户现在需要的是注意力机制的通俗解释。他们可能对复杂的数学细节不太熟悉,所以需要避免过多的公式,转而用类比和简单例子说明。同时,用户提供的引用1详细解释了Self-AttentionAttention的区别,特别是Source和Target的关系,而引用2介绍了SE模块中的压缩和激励操作。这些可以作为参考,但用户明确说这些引用不是真实需求,应该更关注他们当前的问题。 用户可能对注意力机制的基本工作原理、为什么有效,以及常见的应用场景感兴趣。需要从基础讲起,逐步引导,确保结构清晰。可能还需要联系到他们之前的问题,比如点云配准中的注意力应用,但用户这次的问题比较基础,暂时不需要深入结合。 需要检查是否有误解,比如用户是否混淆了不同的注意力机制类型,比如在视觉中的SE模块和NLP中的Transformer。但用户现在只要求基础概念,所以可以涵盖不同类型,但重点放在核心思想。 可能需要用生活中的例子来比喻,比如手电筒聚焦、老师改卷子等,帮助理解。同时,要提到注意力机制的关键要素:查询、键、值,以及权重计算。这些是基础中的基础,必须涵盖。 用户可能还想知道注意力机制的优势,比如处理长距离依赖、动态权重等,以及为什么它在深度学习中被广泛应用。可以简要提到在机器翻译、图像处理中的例子,如Transformer和SE模块,但不需要深入技术细节。 最后,确保回答符合之前的格式要求,使用中文,行内公式用$...$,独立公式用$$...$$,但用户要求通俗易懂,可能需要减少公式,或仅在必要时简单提及。同时,生成相关问题,帮助用户进一步学习。 总结回答结构:定义注意力机制,核心思想,关键要素,通俗例子,应用场景,简单公式说明,优缺点,相关问题。保持口语化,避免术语堆砌。</think>### 注意力机制通俗解释 #### 一、基础概念 **注意力机制**(Attention Mechanism)模仿人类的视觉注意力: - **核心思想**:在处理大量信息时,像“手电筒”一样聚焦于关键部分 - **数学本质**:动态分配权重($0 \sim 1$),加权计算输出值 - **关键三要素**: 1. **查询(Query)**:当前关注的目标(如翻译中的中文词) 2. **键(Key)**:待筛选的信息源(如待参考的英文词) 3. **值(Value)**:实际用于计算的信息(通常Key关联) #### 二、通俗类比 想象老师批改试卷: 1. **查询(Query)**:老师心中对“易错题”的标准 2. **键(Key)**:试卷每道题的特征(如题号、难度) 3. **值(Value)**:每道题的实际内容 老师通过对比标准题目特征(QueryKey的相似度),给易错题分配更高权重(注意力分数),最终重点检查这些题目(加权后的Value)。 #### 三、简单数学表示 对于每个查询$q_i$,计算注意力权重$\alpha_{ij}$: $$ \alpha_{ij} = \frac{\exp(q_i \cdot k_j)}{\sum_{j'} \exp(q_i \cdot k_{j'})} $$ 最终输出为所有值的加权和: $$ \text{Output}_i = \sum_j \alpha_{ij} v_j $$ 这就像用“软性选择”(Softmax)代替“硬性筛选”(如固定窗口)[^1]。 #### 四、典型应用场景 1. **机器翻译**:生成中文词时,自动关注相关英文词(如Transformer模型)[^1] 2. **图像处理**:SE模块通过通道注意力强化重要特征(见图1)[^2] 3. **点云配准**:动态关注点云中的关键区域建立对应关系[^3] #### 五、优势局限 ✅ **优势**: - 处理长距离依赖(如文本中相隔很远的关联词) - 可解释性强(通过权重可视化关注区域) - 灵活适应不同输入长度 ❌ **局限**: - 计算复杂度随输入长度平方增长(如处理1000个元素需百万次计算) - 需要大量数据训练注意力权重分配模式 #### 六、常见变体 | 类型 | 特点 | 应用场景 | |--------|------------------------|----------------| | **自注意力** | 在单序列内部计算注意力(Query=Key=Value) | Transformer编码器[^1] | | **交叉注意力** | 在两个不同序列间计算注意力(如中英翻译) | Transformer解码器 | | **通道注意力** | 关注特征图的不同通道(如SE模块)[^2] | 图像分类 | ```python # 简化版注意力计算(伪代码) def attention(query, keys, values): scores = query @ keys.T # 计算相似度 weights = softmax(scores) # 归一化为概率分布 return weights @ values # 加权求和 ``` #### 七、生活中的注意力现象 - **视觉聚焦**:在人群中快速识别熟人(抑制无关信息) - **听力选择**:嘈杂环境中听清特定对话(声音信号加权) - **阅读重点**:读书时画线标记关键段落(信息优先级划分) --- ### 相关问题 1. 自注意力(Self-Attention)和普通注意力有什么区别? 2. 如何降低注意力机制的计算复杂度? 3. 通道注意力(如SE模块)在卷积神经网络中如何工作? [^1]: 参考自注意力机制在Transformer中的应用分析 [^2]: 关联SE模块的通道注意力实现原理 [^3]: 延伸至点云配准中的注意力技术演进
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值