测试点5段错误
bool cmp(vector<int> vec1, vector<int> vec2)
{
int n1=vec1.size(),m1=vec2.size();
int len=min(n1,m1);
for(int i=0;i<len;++i)
{
if(vec1[i]!=vec2[i])return vec1[i]>vec2[i];
}
return 0;
}
注意当两条路径完全相等的时候他们最后必须return 0,否者会因为cmp函数没有返回值而引起段错误
测试点6答案错误
错误原因
正如参考文献所说,如果在一开始输入的时候从大到大开始排序遍历,这样可能因为当前层有权重相等的结点导致路径实际上不满足条件
参考文献:https://blog.csdn.net/zxc0074869/article/details/122786262
正确解法
我们需要在dfs取得所有path之后对于所有的path进行排序就可以通过测试点6
全部代码
#include<bits/stdc++.h>
using namespace std;
#define eb emplace_back
#define pb pop_back
#define int long long
int n,m,S;
const int maxn=1e3+10;
vector<int>tree[maxn];
vector<int>paths[maxn];
int w[maxn];
int cnt;
string nds;
int checkNds(string nds)
{
int sum=0;
for(int i=0;i<nds.size();++i)
{
char ch=nds[i];
sum=sum*10+(ch-'0');
}
return sum;
}
void dfs(int cur,long long sum,vector<int>& temp)
{
temp.eb(w[cur]);
sum=sum+w[cur];
if(sum==S and tree[cur].size()==0){
paths[cnt++]=temp;
return;
}
for(auto it:tree[cur])
{
dfs(it,sum,temp);
temp.pb();
}
}
bool cmp(vector<int> vec1, vector<int> vec2)
{
int n1=vec1.size(),m1=vec2.size();
int len=min(n1,m1);
for(int i=0;i<len;++i)
{
if(vec1[i]!=vec2[i])return vec1[i]>vec2[i];
}
return 0;
}
signed main()
{
cin>>n>>m>>S;
for(int i=0;i<n;++i)cin>>w[i];
for(int i=0;i<m;++i)
{
string thead,tchild;
int k;
cin>>thead>>k;
int head=checkNds(thead);
for(int i=0;i<k;++i){
cin>>tchild;
tree[head].push_back(checkNds(tchild));
}
}
vector<int>temp;
dfs(0,0,temp);
sort(paths,paths+cnt,cmp);
for(int i=0;i<cnt;++i)
{
for(int j=0;j<paths[i].size();++j)
{
if(j>0)cout<<" ";
cout<<paths[i][j];
}
cout<<"\n";
}
return 0;
}
/*
段错误原因:
1.越界访问
2.大数组一定要开全局,而不是写在main函数里面。
3.sort函数使用错误
4. cmp函数没有返回值(可能是因为没有写全)
*/