PTA甲级1053 Path of Equal Weight 测试点5段错误和测试点6答案错误

测试点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函数没有返回值(可能是因为没有写全) 
*/

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值