总结时间:2022/8/2~8/3
打比赛总结:航电杯6
主要是补题补了一个图论题目,想法十分牛,就是建立一个外点来作为中转站,替代了原来要建立的n*n/2条边,十分可以,就是在补题目的过程中,那个分层的数组开在里面每次都是卡我,卡的老火了!!!!
后面总算是过了。
#include <bits/stdc++.h>
using namespace std;
#define OST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define pair pair<int, int>
#define ll long long
const int N = 1e6 + 1;
const ll inf = 0x3f3f3f3f3f3f3f3f;
struct node {
int x;
ll v;
bool friend operator<(node x1, node x2) { return x1.v > x2.v; }
};
vector<node> e[3 * N];
// vector<int> dep[N];
int dp[N];
ll low[3 * N];
bool vis[3 * N];
int n, s, t, k, p, point, ceng;
priority_queue<node> q;
// void dfs(int fa, int u, int cnt) {
// if (vis[u]) return;
// vis[u] = 1;
// ceng = max(ceng, cnt);
// dep[cnt].push_back(u);
// for (auto v : e[u]) {
// if (v.x != fa) { dfs(u, v.x, cnt + 1); }
// }
// }
void dfs1(int fa, int u) {
dp[u] = dp[fa] + 1;
ceng = max(ceng, dp[u]);
for (auto v : e[u]) {
if (v.x != fa) { dfs1(u, v.x); }
}
}
void init() {
point = 0;
ceng = 0;
for (int i = 0; i < 3 * N; i++) {
e[i].clear();
low[i] = inf;
vis[i] = 0;
}
}
void Dij() {
// memset(vis, 0, sizeof(vis));
// priority_queue<node> q;
while (!q.empty()) q.pop();
q.push({s, 0});
low[s] = 0;
vis[s] = 1;
while (!q.empty()) {
auto now = q.top();
q.pop();
for (auto x : e[now.x]) {
if (low[x.x] > low[now.x] + x.v) {
low[x.x] = low[now.x] + x.v;
if (!vis[x.x]) {
q.push({x.x, low[x.x]});
vis[x.x] = 1;
}
}
}
}
cout << low[t] << endl;
}
void solve() {
init();
cin >> n;
for (int i = 1; i < n; i++) {
int u, v, z;
cin >> u >> v >> z;
e[u].push_back({v, z}), e[v].push_back({u, z});
}
dp[0] = -1;
dfs1(0, 1);
cin >> k >> p;
// vector<int> dep[ceng + 1];
// for (int i = 1; i <= n; i++) { dep[dp[i]].push_back(i); }
// for (int i = 1; i <= ceng; i++) {
// cout << i << "**";
// for (auto x : dep[i]) { cout << x << " "; }
// cout << endl;
// }
// cout << ceng << endl;
// for (int i = 1; i <= ceng; i++) {
// point += 2;
// for (auto x : dep[i]) {
// e[x].push_back({n + (point - 1), 0});
// e[x].push_back({n + (point), 0});
// }
// if (i - k >= 1) {
// for (auto x : dep[i - k]) { e[n + point - 1].push_back({x, p}); }
// }
// if (i + k <= ceng) {
// for (auto x : dep[i + k]) { e[n + point].push_back({x, p}); }
// }
// if (i - k - 1 > 0) dep[i - k - 1].clear();
// // dep[i].clear();
// }
for (int i = 1; i <= n; i++) {
if (dp[i] != 0) { e[i].push_back({n + 2 * dp[i] - 1, p}); }
if (dp[i] != ceng) { e[i].push_back({n + 2 * (dp[i] + 1), p}); }
if (dp[i] + k <= ceng) { e[n + 2 * (dp[i] + k) - 1].push_back({i, 0}); }
if (dp[i] - k >= 0) { e[n + 2 * (dp[i] - k + 1)].push_back({i, 0}); }
}
cin >> s >> t;
Dij();
}
int main() {
OST;
int T;
cin >> T;
while (T--) { solve(); }
return 0;
}
然后是就是其他的刷题:
基本都是1600分的题目,主要是练练思维能力,还有题目的切入点、。
然后就是一场DIV3CF:
然后就是请假了 。。