#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 ;
}
关于两组不相交的数组的biset
最新推荐文章于 2026-07-03 10:00:25 发布
该代码主要解决的问题是找到1到num的所有可能的组合,使得在给定的一系列道路(道路由两个端点组成且有序)中,任意两条路径之间没有交叉。通过回溯算法生成所有可能的组合,并使用unordered_set存储和检查路径是否交叉。
434

被折叠的 条评论
为什么被折叠?



