1146.相似度

相似度:

时间限制:1500MS内存限制:128000KB

题目描述

  小G通过摆放一些城市和道路构成了一个世界地图。趁着小G出去玩的时候,大G把小G的世界地图上的城市全部打乱并放在了原来这些城市所在的位置(并不是一一对应),又修改了一些道路。小G玩完回来后发现自己的东西被打乱了,感到非常生气,但是他又被一个更有趣的问题吸引了:被修改之后的世界地图与原来的世界地图的最大相似度是多少?
   (ps:相似度的定义为将城市还原后还有多少条道路和之前的道路相同)
 

输入

第一行为两个整数n,m,表示一共有n个城市,m条道路
接下来m行,每行两个整数x,y,表示原来小G的世界地图中有一条道路连接编号为x和y的两个城市。
紧接着m行,每行两个整数x’,y’,表示被大G修改后的世界地图中有一条道路连接编号为x’和y’的两个城市。

输出

一行一个整数,表示最大相似度。

输入样例复制

4 5
4 3
2 1
3 2
2 4
2 3
1 4
3 2
2 1
1 3
4 4

输出样例复制

说明

【样例解释】 原图中的1,2,3,4号城市分别对应现在图中的4,1,2,3 将修改后的图还原 1 4->2 1 3 2->4 3 2 1->3 2 1 3->2 4 4 4->1 1 与原图比较发现有4条边是一样的。 【数据规模和约定】 对于30%的数据,1 ≤ n ≤ 3,1 ≤ m≤ 20。 对于60%的数据,1 ≤ n ≤ 7,1 ≤ m≤ 70。 对于100%的数据,1 ≤ n ≤ 9,1 ≤ m≤ 300。

 

解法:

这一题全排列,,,,之后再一一比较。

 

程序:

#include <iostream>
 #include <cstdlib>
 #include <cstring>
 #include <algorithm>
 #include <cstdio> 
 using namespace std;
 int  ans,z,xx[5001],yy[5001],x,y,s[5001],map[5001][5001],f[1001][1010];
 bool p[5001];
 int n,m;
 
 void bfs ()
 {
     ans=0;
     int t,tt;
     for (int i=1;i<=n;i++)
       for (int j=1;j<=n;j++)
       map[i][j]=f[i][j];
     for (int i=1;i<=m;i++)
     {
         t=s[xx[i]];
        tt=s[yy[i]];     
        if (map[t][tt]>0)
        {
            map[t][tt]--;
            ans+=1;

        }
     }

     z=max(z,ans);
 }
 
 
 void tj (int c)
 {
     if (c==n)
     {
         bfs ();
         return;
     }
     for (int i=1;i<=n;i++)
     {
         if (p[i]==0)
         {
            s[i]=c+1;
            p[i]=1;
             tj(c+1);
            p[i]=0;    
         }
     }
 }
 
 
 int main()
 {
     cin>>n>>m;
       for (int j=1;j<=m;j++)
       {
           cin>>x>>y;
           map[x][y]++;
           f[x][y]++;
       }
       for (int j=1;j<=m;j++)
           cin>>xx[j]>>yy[j];
       tj(0);
       cout<<z;
 }

<think>好的,我现在需要帮助用户了解PyTorch的torch.nn.functional模块中与相似度计算相关的函数。首先,我要回忆一下这个模块中常用的相似度计算方法有哪些。常见的应该有余弦相似度(cosine similarity)、点积相似度(dot product),可能还有其他的比如欧氏距离之类的,但用户可能更关心的是直接计算相似度的函数。 接下来,我需要确认这些函数的具体名称和用法。比如,F.cosine_similarity是用于计算余弦相似度的,而点积可能需要结合其他函数,比如torch.matmul或者直接使用乘法后求和。不过用户可能更关注的是F中现成的函数,而不是手动实现的步骤。 然后,我需要考虑如何组织这些信息,按照用户的要求,结构要清晰,分点说明每个函数的使用方法和示例。同时,根据用户提供的引用,可能需要引用相关的资料,比如用户提到的unfold和fold函数,或者Softmax,但这些和相似度计算可能关系不大,所以可能不需要引用这些。不过要注意用户给出的引用内容,如果有相关的地方需要引用的话要加上。 另外,用户需要示例代码,所以每个函数都要给出一个简单的Python代码示例,使用PyTorch的F模块。需要确保代码语法正确,并且符合PyTorch的常见用法。比如,在计算余弦相似度时,要指定维度,并注意输入的张量形状是否匹配。 可能需要注意的地方包括:不同函数的参数设置,比如dim参数在余弦相似度中的使用,是否需要对输入进行归一化处理,比如点积相似度是否需要先进行L2归一化才能得到余弦相似度。需要明确说明这些细节,避免用户误解。 然后,生成相关问题,这些问题应该围绕相似度计算的其他方法、参数影响、实际应用场景、性能优化,以及与Softmax的结合使用等。比如,可以问如何选择相似度计算方法,或者如何处理不同形状的张量计算相似度。 最后,确保回答符合系统级指令,所有数学公式用$...$,独立公式用$$...$$,正确使用中文,没有Markdown格式,代码块用三个反引号包围,并正确添加引用标识。不过根据用户提供的引用,可能引用[1]和[2]并不直接相关,但如果有相关内容可以引用的话需要加上。比如,在提到归一化时,可能提到Softmax函数,这时可以引用[2],说明相似度计算后可能使用Softmax进行概率转换。 总结步骤: 1. 列出F模块中的相似度计算函数,如cosine_similarity。 2. 对其他相似度方法(如点积)进行说明,可能需要结合其他函数。 3. 为每个方法提供示例代码,解释参数和步骤。 4. 添加相关问题,覆盖方法选择、参数影响、应用场景、性能、扩展应用等。 5. 检查是否需要引用提供的资料,可能在讨论Softmax应用时引用[2]。 6. 确保格式正确,无Markdown,代码正确,数学公式正确使用$符号。</think>### torch.nn.functional 相似度计算方法及示例 PyTorch 的 ${\tt torch.nn.functional}$ 模块提供了以下常用的相似度计算函数: --- #### 1. 余弦相似度 (Cosine Similarity) 函数:${\tt F.cosine\_similarity(x1, x2, dim=1, eps=1e-8)}$ **功能**:计算两个张量在指定维度上的余弦相似度,公式为 $$ \text{similarity} = \frac{x_1 \cdot x_2}{\max(\|x_1\| \|x_2\|, \epsilon)} $$ **参数**: - ${\tt dim}$:计算维度 - ${\tt eps}$:防止除零的小常数 **示例**: ```python import torch import torch.nn.functional as F x = torch.tensor([[1.0, 2.0], [3.0, 4.0]]) y = torch.tensor([[5.0, 6.0], [7.0, 8.0]]) similarity = F.cosine_similarity(x, y, dim=1) # 输出形状为 (2,) ``` --- #### 2. 点积相似度 (Dot Product) PyTorch 未提供直接的点积函数,但可通过张量操作实现: **实现方式**: $$ \text{similarity} = \sum_{i} x_1^{(i)} \cdot x_2^{(i)} $$ **示例**: ```python x = torch.tensor([1.0, 2.0]) y = torch.tensor([3.0, 4.0]) dot_product = torch.dot(x, y) # 输出 11.0 # 批量计算(需对齐维度) batch_x = torch.tensor([[1.0, 2.0], [3.0, 4.0]]) batch_y = torch.tensor([[5.0, 6.0], [7.0, 8.0]]) batch_dot = (batch_x * batch_y).sum(dim=1) # 输出 [17.0, 58.0] ``` --- #### 3. 成对相似度矩阵 (Pairwise Similarity) 结合广播机制和矩阵乘法可计算成对相似度: **示例**: ```python # 计算两个张量间的余弦相似度矩阵 x = torch.randn(3, 128) # 形状 (N, D) y = torch.randn(5, 128) # 形状 (M, D) x_norm = F.normalize(x, p=2, dim=1) # L2归一化[^2] y_norm = F.normalize(y, p=2, dim=1) similarity_matrix = torch.mm(x_norm, y_norm.T) # 输出形状 (3, 5) ``` --- #### 4. 自定义相似度计算 通过张量操作实现其他相似度(如欧氏距离): **示例**: ```python def euclidean_distance(x1, x2): return torch.sqrt(torch.sum((x1 - x2)**2, dim=-1)) x = torch.tensor([[1.0, 2.0], [3.0, 4.0]]) y = torch.tensor([[5.0, 6.0], [7.0, 8.0]]) distance = euclidean_distance(x, y) # 输出 [5.6569, 5.6569] ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值