前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【信息学做题日记】费了牛劲,终于AC掉缩点

【信息学做题日记】费了牛劲,终于AC掉缩点

作者头像
小码匠
发布2024-07-05 15:53:10
1000
发布2024-07-05 15:53:10
举报
文章被收录于专栏:小码匠和老码农

今天分享的题目是:缩点,其实这道题去年就做过。

可惜,华丽丽的爆零,时隔快1年了,再战这道题,

依然不是顺风顺水能搞定,也是费了牛劲。

就在我准备让小码匠放弃的时候,最终还是解决掉了。

不知道各位家长有没有同感,孩子学习信息学

  • 一是:到瓶颈期突破很难,很难;
  • 二是:一年前不会的题目,可能过了一年,还是很费劲,能力真不是线性增长的。 不是你去年考个一等,今年还能拿一等,也许也就拿个二等。

所以:心态很重要,莫要过于心急,心急真吃不了热豆腐。

最近单位比较忙,也没有做到日更,有时间就写点。

好啦,不废话了。

分享下AC代码:

代码语言:javascript
复制
// 题目: 【模板】缩点
// 链接: https://www.luogu.com.cn/problem/P3387
// 难度: 普及+/提高
#include <bits/stdc++.h>

using namespace std;
#define endl '\n';

const int maxn = 1e4 + 10;
typedef long long ll;
int dfn[maxn], low[maxn], w[maxn], cnt[maxn], degree[maxn], dis[maxn], t = 1, n, m;
stack<int> st;
bool vis[maxn];

struct edge {
    int from, to, next;
} g[maxn * 11], g2[maxn * 11];
int head[maxn], head2[maxn];
int k = 0;

void add(int u, int v) {
    g[++k].to = v;
    g[k].from = u;
    g[k].next = head[u];
    head[u] = k;
}

void add2(int u, int v) {
    g2[++k].to = v;
    g2[k].from = u;
    g2[k].next = head2[u];
    head2[u] = k;
}

void tarjan(int x) {
    st.push(x);
    vis[x] = true;
    dfn[x] = t;
    low[x] = t;
    ++t;
    for (int i = head[x]; i; i = g[i].next) {
        int v = g[i].to;
        if (dfn[v] == 0) {
            tarjan(v);
            low[x] = min(low[x], low[v]);
        } else if (vis[v]) {
            low[x] = min(low[x], low[v]);
        }
    }
    if (dfn[x] == low[x]) {
        while (!st.empty()) {
            int u = st.top();
            vis[u] = false;
            st.pop();
            cnt[u] = x;
            if (x == u) {
                break;
            }
            w[x] += w[u];
        }
    }
}

int topo() {
    queue<int> q;
    for (int i = 1; i <= n; ++i) {
        if (cnt[i] == i && !degree[i]) {
            q.push(i);
            dis[i] = w[i];
        }
    }
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (int i = head2[u]; i; i = g2[i].next) {
            int v = g2[i].to;
            dis[v] = max(dis[v], dis[u] + w[v]);
            --degree[v];
            if (!degree[v]) {
                q.push(v);
            }
        }
    }
    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        ans = max(ans, dis[i]);
    }
    return ans;
}


void best_coder() {
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        cin >> w[i];
    }
    for (int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;
        add(u, v);
    }
    for (int i = 1; i <= n; ++i) {
        if (!dfn[i]) {
            tarjan(i);
        }
    }

    k = 0;
    for (int i = 1; i <= m; ++i) {
        if (cnt[g[i].from] != cnt[g[i].to]) {
            add2(cnt[g[i].from], cnt[g[i].to]);
            ++degree[cnt[g[i].to]];
        }
    }
    int ans = topo();
    cout << ans;
}

void happy_coder() {

}

int main() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    // 小码匠
    best_coder();

    // 最优解
    // happy_coder();

    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小码匠和老码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档