关于两组不相交的数组的biset

该代码主要解决的问题是找到1到num的所有可能的组合,使得在给定的一系列道路(道路由两个端点组成且有序)中,任意两条路径之间没有交叉。通过回溯算法生成所有可能的组合,并使用unordered_set存储和检查路径是否交叉。


#include<iostream>
#include<string>
#include<vector>
#include<unordered_set>

using namespace std;
class Solution
{
public:
    vector<vector<int>> res;//res是1-num的所有的组合
    vector<int> path;
    int slove(int num,vector<int> & nums)//nums是路径
    {
        vector<vector<int>> roads;
        unordered_set<string> set;//
        for(int i=0;i<nums.size();i=i+2)
        {
            if(nums[i]<nums[i+1])
                roads.push_back({nums[i],nums[i+1]});
            else if(nums[i]>=nums[i+1])
            {
                roads.push_back({nums[i+1],nums[i]});
            }
        }
        for(int i=0;i<roads.size();i++)
        {
            set.insert(to_string(roads[i][0])+'#'+to_string(roads[i][1]));
        }

        //vecs里面是1~num
        vector<int> vecs;
        for(int i=1;i<=num;i++)
        {
            vecs.push_back(i);
        }
        backing(vecs,0);//填充res

        int n=res.size()-2;
        vector<vector<int>> vec1;
        vector<vector<int>> vec2;
        for(int i=0;i<res.size();i++)
        {
            if(res[i].size()!=0 && res[i].size()!=num)
            {
                vec1.push_back(res[i]);
                vec2.push_back(reversevec(res[i],num));
            }
        }
        int mark=0;
        for(int i=0;i<res.size()-2;i++)
        {
            vector<int> nums1=vec1[i];
            vector<int> nums2=vec2[i];
            if(func(nums1,set) && func(nums2,set))//如果nums1和nums2中的元素互不干涉
                mark=1;
            
        }
        if(mark==1)
            return 1;
        return -1;
       
    }

    bool func(vector<int> & nums,unordered_set<string>& set)//能否在set中找到,不能的话,返回1
    {
        int mark=1;
        for(int i=0;i<nums.size();i++)
        {
            
            for(int j=i+1;j<nums.size();j++)
            {
                string temp=to_string(nums[i])+'#'+to_string(nums[j]);
                if(set.find(temp)!=set.end())
                {
                    mark=0;
                    break;
                }

            }
        }
        return mark;
    }

    vector<int> reversevec(vector<int> & nums,int num)
    {
        vector<int> res;
        unordered_set<int> set;
        for(auto it:nums)
        {
            set.insert(it);
        }
        for(int i=1;i<=num;i++)
        {
            if(set.find(i)==set.end())
            {
                res.push_back(i);
            }
        }
        return res;
    }

    
    void backing(vector<int>& nums,int startindex)
    {
        res.push_back(path);

        for(int i=startindex;i<nums.size();i++)
        {
            path.push_back(i);

            backing(nums,i+1);

            path.pop_back();
        }
    }
}; 

int main()
{
    Solution slu;
    int num=7;
    vector<int> nums={1,2,2,3,1,6,4,6,2,4,2,7,2,5,6,7,3,5,5,7};
    cout<<slu.slove(num,nums)<<endl;
    return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值