路程
路程
题意
构造一个点数不超过
入度为
从
思路
先想到可以把每个数二进制拆分了,每一位对应 DAG 上的一层。
可以写出一个类似于数位 dp 的记忆化搜索。
搜索时顺便加边即可。
这样构造并不优秀,最大可能有
这时想到,能
进制越大,点数越小,边数越大。
换成
这时可以想到枚举进制,取出满足条件的构造就行。
这样已经有
部分数据会出现边数只超过限制几条的情况,考虑优化。
如果一个点的入度为
因为我们可以把它的前驱连向它的所有后继,这样可以省下
跑完数位 dp 后再 dfs 一遍进行入度优化,优化完后可以跑过所有点。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 117;
int base, in[N];
int len, m, a[N], f[N][2], cnt, tot;
vector <pair <int, int>> E[N];
vector <pair <int, int>> e[N];
bool vis[N];
int dfs(int x, bool fp) { // 类似数位 dp 的记搜
if (x == 0) return 114; // 没了, 返回终点
if (f[x][fp]) return f[x][fp]; // 建过点了, 返回
int res = ++ cnt, fpmax = fp ? a[x] : base - 1;
for (int i = 0; i <= fpmax; i ++)
E[res].push_back({dfs(x - 1, fp && (i == fpmax)), i * pow(base, x - 1)}); // 连边
f[x][fp] = res; // 记忆化
return res;
}
void dfs2(int x) { // 入度优化
if (vis[x]) return ;
vis[x] = 1;
for (auto [y, z] : E[x]) {
dfs2(y);
if (in[y] == 1 && y != 114) { // 入度为 1 注意不能把终点优化了
for (auto [v, w] : E[y])
e[x].push_back({v, w + z});
E[y].clear();
tot --;
} else e[x].push_back({y, z});
}
E[x] = e[x];
}
bool check(int n) {
for (int i = 0; i < N; i ++)
E[i].clear(), e[i].clear();
memset(f, 0, sizeof(f));
memset(in, 0, sizeof(in));
memset(vis, 0, sizeof(vis));
cnt = m = len = 0;
while (n) {
a[++ len] = n % base;
n /= base;
}
dfs(len, 1); // dp
for (int i = 1; i <= cnt; i ++)
for (auto y : E[i]) in[y.first] ++;
tot = cnt;
dfs2(1); // 优化
for (int i = 1; i <= 114; i ++)
m += E[i].size();
return tot + 1 <= 18 && m <= 45;
}
int main() {
freopen("road.in", "r", stdin);
freopen("road.out", "w", stdout);
int n;
cin >> n;
for (base = 2; base <= 30; base ++) // 枚举进制
if (check(n)) break; // 满足条件就输出
cout << tot + 1 << " " << m << "\n";
for (int i = 1; i <= 114; i ++)
for (auto y : E[i]) {
cout << i << " " << y.first << " " << y.second << "\n";
}
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18526174,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】