两日总结九

总结时间: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:

然后就是请假了 。。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值