• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
jacklee404
Never Stop!
博客园    首页    新随笔    联系   管理    订阅  订阅
L3-025 那就别担心了 (记忆化搜索)

题目传送门

思路

首先可以确定这是有向无环图,由于没有给出边的数量,数据可能很大,单纯的dfs会超时,这时我们可以进行记忆化搜索。

开个数组b, 记b[i] 为从点i到终点的所有点数,特别的我们还需要注意一下如果这个点i不能到达终点则b[i] = 0

Code

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define siz(x) (int)x.size()
#define IOS ios::sync_with_stdio(false);
#define rep(i, j, k) for(int i = j; i <= k; ++ i)
#define per(i, j, k) for(int i = j; i >= k; -- i)
#define dbg1(a) cout << a << endl;
#define dbg2(a, b) cout << a << " " <<  b << endl;
#define dbg3(a, b, c) cout << a << " " << b << " " << c << endl;
#define pb(x) push_back(x)
#define eb(x) emplace_back(x)
#define all(x) x.begin(), x.end()
#define f first
#define s second
#define lc p<<1
#define rc p<<1|1
using namespace std;
typedef long long LL;
typedef priority_queue<int, vector<int>, greater<int>> S_HEAP;
typedef priority_queue<int> B_HEAP; 
typedef pair<string, int> PSI;
typedef pair<int, int> PII;
const int N = 1e6 + 10;

vector<int> a[500];
int b[N];
bool ok;

int st, ed;

void add(int b, int c) {
	a[b].push_back(c);
}

int dfs(int p) {
	if (a[p].size() == 0 && p != ed) {
        b[p] = 0;
		ok = false;
		return 0;
	} else if (p == ed) {
		return 1;
	}

	if (b[p] != -1) {
		return b[p];
	}
    
    b[p] = 0;
    
	for (auto &x: a[p]) {
		b[p] += dfs(x);
	}

	return b[p];
}

int main() {
	memset(b, -1, sizeof b);
    ok = true;
	int n, m; cin >> n >> m;
	for (int i = 1; i <= m + 1; i ++) {
		int b, c; cin >> b >> c;
		if (i == m + 1) {
			st = b, ed = c;
		} else {
			add(b, c);
		}
	}
//     cout << st << " " << ed << endl;
	dfs(st);
	cout << b[st] << " " << (ok?"Yes":"No");
}
posted on 2022-12-25 18:13  Jack404  阅读(29)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3