GYM 101755 D.Transfer Window(Floyd+二分匹配-hungary+dfs)

本文介绍了一种解决特定换人序列问题的算法实现,通过Floyd算法预处理可达矩阵,并结合最大匹配算法来确定是否能将现有队员换成理想队员。讨论了如何避免换人过程中的冲突,提供了一个完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

共有nn名队员,队伍里已有k名队员a1,...,aka1,...,ak,但是期望队伍里有的队员是b1,...,bkb1,...,bk,已知矩阵Ai,jAi,j,其中Ai,j=1Ai,j=1表示队伍中的ii队员可以换成j队员(ii队员在队伍里且j队员不在队伍里的前提下),问是否存在一个换人序列可以把这kk名队员换成理想的k名队员

Input

第一行两个整数n,kn,k表示队员总数和队伍中队员数量,之后kk个整数a1,...,ak表示已在队伍的队员,之后kk个整数b1,...,bk表示期望在队伍的队员,最后一个n×nn×n0101矩阵AA(1kn300)

Output

如果存在一个合法的换人序列则输出YESYES和换人操作次数以及具体操作,否则输出NONO

Sample Input

5 2
1 2
4 5
00100
00100
00011
00000
00000

Sample Output

YES
4
1 3
3 4
2 3
3 5

Solution

首先用FloydFloyd把一步可达矩阵变成可达矩阵,对于已有队员集合和期望队员集合,去掉其中相同的队员,假设剩下mm个人,根据可达矩阵对这m对人建二分图求最大匹配,如果最大匹配小于mm说明无解,否则说明有一种方案可以把已有的m个人分别与期望的mm个人一一对应,但是注意到这m个一一对应事实上是mm条换人的路径,而这m条路径可能会交叉,例如在把已有一名队员变成期望的一名队员时,交换路径中可能出现了一个也在已有队员集合中的队员,这是不合法的,所以在考虑具体方案时需要做一些处理,在依次处理这mm条路径时,对于当前处理的路径,假设从1aa(用数字表示在队伍中的队员,用小写字母表示不在队伍中的队员)的路径是:

1bc2dea

如果直接按顺序把这个换人序列输出的话,由于22已经在队伍中,不可能用c22再换到队伍中,所以要对这个序列做一些处理,注意到只要我们把该操作序列变成2dea1bc21→b→c→2就可以避免冲突,即从目标点往前,遇到一个在队伍中的点就把已有操作序列输出,之后继续往前直至到起点,如此操作可以使得从11换到a的过程中,只改变了11a的归属而不会影响其他点

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=305;
int uN,vN;//u,v数目
int g[maxn][maxn];//编号是0~n-1的 
int linker[maxn];
bool used[maxn];
bool dfs(int u)
{
    int v;
    for(v=0;v<vN;v++)
        if(g[u][v]&&!used[v])
        {
            used[v]=true;
            if(linker[v]==-1||dfs(linker[v]))
            {
                linker[v]=u;
                return true;
            }    
        }  
    return false;  
}    
int hungary()
{
    int res=0;
    int u;
    memset(linker,-1,sizeof(linker));
    for(u=0;u<uN;u++)
    {
        memset(used,0,sizeof(used));
        if(dfs(u))  res++;
    } 
    return res;   
}  
int n,k,m[maxn][maxn],G[maxn][maxn],va[maxn],vb[maxn],vis[maxn];
char s[maxn];
vector<P>ans,S;
int dfs(int u,int v)
{
    vis[u]=1;
    if(u==v)return 1;
    for(int w=1;w<=n;w++)
        if(G[u][w]&&!vis[w])
        {
            if(dfs(w,v))
            {
                S.push_back(P(u,w));
                if(va[u])
                {
                    for(int i=S.size()-1;i>=0;i--)ans.push_back(S[i]);
                    S.clear();
                }
                return 1;
            }
        }
    return 0;
}
int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        memset(va,0,sizeof(va));
        memset(vb,0,sizeof(vb));
        int temp;
        for(int i=0;i<k;i++)scanf("%d",&temp),va[temp]=1;
        for(int i=0;i<k;i++)scanf("%d",&temp),vb[temp]=1;
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s+1);
            for(int j=1;j<=n;j++)
                G[i][j]=m[i][j]=s[j]-'0';
        }
        for(int l=1;l<=n;l++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    if(m[i][l]&&m[l][j])m[i][j]=1;
        memset(g,0,sizeof(g));
        int res=0;
        for(int i=1;i<=n;i++)
            if(va[i]&&!vb[i])
            {
                res++;
                for(int j=1;j<=n;j++)
                    if(vb[j]&&!va[j]&&m[i][j])g[i-1][j-1]=1;
            }
        vN=uN=n;
        if(hungary()!=res)printf("NO\n");
        else
        {
            printf("YES\n");
            ans.clear();
            S.clear();
            for(int i=1;i<=n;i++)
                if(vb[i])
                {
                    if(va[i])continue;
                    int u=linker[i-1]+1,v=i;
                    memset(vis,0,sizeof(vis));
                    dfs(u,v);
                    va[u]=0,va[v]=1;
                }
            printf("%d\n",ans.size());
            for(int i=0;i<ans.size();i++)printf("%d %d\n",ans[i].first,ans[i].second,i==ans.size()-1?'\n':' ');
        }
    }
    return 0;
}
<think>好的,用户遇到了gym库中找不到'hopper-medium'环境的问题,我需要帮他解决。首先,我得确认这个环境是否真的存在。根据我对gym的了解,Hopper环境通常是在Gym的MuJoCo环境中,比如'Hopper-v2'或'Hopper-v4'。可能用户提到的'hopper-medium'是某个特定版本或自定义环境。 接下来,我要检查可能的原因。首先,用户是否安装了正确的gym版本?如果是旧版gym,可能需要安装mujoco_py和MuJoCo许可证。另外,新版gym(0.19以后)已经将MuJoCo环境移到单独的库gym-mujoco,所以需要安装这个库。还有可能用户的环境名称拼写错误,应该检查是否有类似'Hopper-v2'这样的名称。 然后,解决方案部分。我应该分步骤指导用户:1. 确认环境名称是否正确,建议使用标准名称。2. 安装必要的依赖,比如gym[mujoco]或者gym-mujoco。3. 如果用户是从某个论文或代码库中看到的'hopper-medium',可能需要安装额外的第三方包,比如d4rl,这个库包含了一些预配置的环境,包括hopper-medium-expert-v0。因此,安装d4rl并导入可能可以解决问题。 此外,用户可能需要安装MuJoCo本身,这需要许可证,不过现在MuJoCo已经免费了,应该更容易安装。需要提醒用户按照官方文档安装步骤操作,避免遗漏依赖项。 最后,测试代码示例也很重要,确保用户能够验证环境是否正确加载。可能需要提供不同的导入方式,比如通过gym.make直接使用标准环境,或者通过d4rl导入特定的环境。 总结起来,用户的问题可能源于环境名称错误、缺少依赖库或未安装第三方包。我需要一步步引导用户检查这些方面,并提供安装和测试的代码示例。</think>### Gym库中"hopper-medium"环境报错解决方案 **问题原因分析**:`hopper-medium`是特定领域研究中使用的预训练环境名称,并非Gym官方标准环境。标准MuJoCo环境命名格式为`Hopper-v{版本号}`,例如: $$ Hopper-v2 \quad Hopper-v3 \quad Hopper-v4 $$ **解决方案步骤**: 1. **验证标准环境可用性**: ```python import gym env = gym.make('Hopper-v3') # 最新版本推荐v4 ``` 2. **安装完整依赖库**(需先安装[MuJoCo](https://mujoco.org/)): ```bash pip install gym[mujoco] # 包含所有MuJoCo环境 # 或指定版本 pip install gym==0.19.0 # 2021年后环境拆分前的版本 ``` 3. **第三方库支持**(适用于D4RL数据集环境): ```bash pip install git+https://github.com/rail-berkeley/d4rl@master ``` ```python import d4rl # 必须导入以注册环境 env = gym.make('hopper-medium-expert-v0') # 正确环境名称 ``` **常见错误排查**: | 错误现象 | 解决方法 | |---------|----------| | `No module named 'mujoco_py'` | 执行`pip install mujoco-py` | | `Missing MuJoCo key` | 申请免费许可证[^1] | | `gym.error.UnregisteredEnv` | 检查环境名称拼写 | **环境版本对照表**: ``` | 环境名称 | 所属库 | 安装命令 | |---------------------|-----------|------------------------------| | Hopper-v2 | gym | pip install gym[mujoco] | | hopper-medium-v0 | d4rl | pip install d4rl | | Hopper-v3 | mujoco-py | pip install mujoco-py<2.1,>=2.0 | ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值