CSU-2172 买一送一 DFS

该博客探讨了如何使用深度优先搜索(DFS)解决CSU-2172编程题。通过记录每个商品上一次出现时的有序对数目和当前已出现的商品总数,避免重复计算,确保正确计算有序对。文章通过回溯策略进行了解题过程的阐述。
摘要由CSDN通过智能技术生成

传送门

思路:

一个点的有序对数目=它上一个点的有序对数目+到目前为止出现过的商品总数-这个点上一次出现时的有序对数目(避免重复计算),我们用一个pre数组记录一下上一个该商品出现时的商品数目,用一个vis数组记录一下一个商品是否出现过,回溯一下就即可

#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=100010;
vector<int>vt[maxn];
int a[maxn];
ll per[maxn];
ll f[maxn];
int vis[maxn];
void dfs(int u,int fa,int cnt)
{
	for(int i=0;i<vt[u].size();i++)
	{
		int v=vt[u][i];
		if(!vis[a[u]])
		{
			cnt++;
		}
		vis[a[u]]++;
		f[v]=f[u]+cnt-per[a[v]];
		int temp=per[a[v]];
		per[a[v]]=cnt;
		dfs(v,u,cnt);
		vis[a[u]]--;
		if(vis[a[u]]==0)
		{
			cnt--;
		}
		per[a[v]]=temp;
	}
}
int main()
{
	int n;
	while(cin>>n)
	{
		memset(vis,0,s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值