社区讨论
萌新,tarjan,50pts,WA14579,马蜂怪异,求助
P3387【模板】缩点参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo8x952p
- 此快照首次捕获于
- 2023/10/28 02:03 2 年前
- 此快照最后确认于
- 2023/10/28 02:03 2 年前
CPP
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 1;
const int maxm = 1e5 + 1;
template<typename T>
void print_array(T * bg, T * ed) {
for (T * i = bg; i < ed; i++) {
cout << *i << " ";
}
cout << endl;
}
struct edge {
int from, to, next;
};
int trans[maxn];
namespace no_ring_graph {
int n, m;
int cnt_edge;
int head[maxn];
edge e[maxm];
int val[maxn];
int intime[maxn];
int dp[maxn];
void addedge(int u, int v) {
e[++cnt_edge].to = v;
e[cnt_edge].from = u;
e[cnt_edge].next = head[u];
head[u] = cnt_edge;
}
int get_max() {
queue<int> que;
int sum = 0;
for (int i = 1; i <= n; i++) {
if (!intime[i]) {
que.push(i);
dp[i] = val[i];
}
}
int cur, mx = -2e9;
while (!que.empty()) {
cur = que.front();
que.pop();
for (int i = head[cur]; i; i = e[i].next) {
int v = e[i].to;
dp[v] = max(dp[v], dp[cur] + val[v]);
intime[v]--;
if (!intime[v]) {
que.push(v);
}
}
}
for (int i = 1; i <= n; i++) {
mx = max(mx, dp[i]);
}
return mx;
}
}
namespace original_graph {
int n, m;
int cnt_edge;
int head[maxn];
edge e[maxm];
int val[maxn];
void addedge(int u, int v) {
e[++cnt_edge].to = v;
e[cnt_edge].from = u;
e[cnt_edge].next = head[u];
head[u] = cnt_edge;
}
int id;
int vis[maxn];
int dfn[maxn];
int low[maxn];
stack<int> path;
vector<int> rings[maxn];
int cnt_ring;
void get_rings(int u, int fa) {
dfn[u] = ++id;
low[u] = dfn[u];
vis[u] = true;
path.push(u);
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].to;
if (vis[v]) {
low[u] = min(low[u], dfn[v]);
} else {
get_rings(v, u);
low[u] = min(low[u], low[v]);
}
}
if (low[u] == dfn[u]) {
cnt_ring++;
int v;
no_ring_graph::val[cnt_ring] = 0;
while (u != v) {
v = path.top();
rings[cnt_ring].push_back(v);
path.pop();
trans[v] = cnt_ring;
no_ring_graph::val[cnt_ring] += val[v];
}
}
}
}
int main() {
cin >> original_graph::n >> original_graph::m;
for (int i = 1; i <= original_graph::n; i++) {
cin >> original_graph::val[i];
}
for (int i = 1; i <= original_graph::m; i++) {
int u, v;
cin >> u >> v;
original_graph::addedge(u, v);
}
for (int i = 1; i <= original_graph::n; i++) {
if (!original_graph::vis[i]) {
original_graph::get_rings(i, 0);
}
}
// print_array(trans + 1, trans + 1 + original_graph::n);
// print_array(no_ring_graph::val + 1, no_ring_graph::val + 1 + original_graph::cnt_ring);
(no_ring_graph::n = original_graph::cnt_ring);
for (int i = 1; i <= original_graph::m; i++) {
int bg = trans[original_graph::e[i].from];
int ed = trans[original_graph::e[i].to];
if (bg == ed) continue;
no_ring_graph::addedge(bg, ed);
no_ring_graph::intime[ed]++;
}
cout << no_ring_graph::get_max() << endl;
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...