社区讨论
TLE第三个点,用了缩点+记搜,类dp(悬赏3关,大声密谋)
P3627[APIO2009] 抢掠计划参与者 4已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lo1wdjsh
- 此快照首次捕获于
- 2023/10/23 04:04 2 年前
- 此快照最后确认于
- 2023/11/03 04:32 2 年前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, arr[500100], vis[500100], low[500100], dfn[500100], sta[500100], ti, tp, loc[500100], is[500100];
vector<int> vec[500010];
void dfs(int index, int back) {
vis[index] = 1; dfn[index] = low[index] = ++ti; sta[++tp] = index;
for(int i=0; i<vec[index].size(); ++i) {
if(!dfn[vec[index][i]]) {
dfs(vec[index][i], index);
low[index] = min(low[index], low[vec[index][i]]);
} else if(vis[vec[index][i]]) {
low[index] = min(low[index], low[vec[index][i]]);
}
}
if(low[index] == dfn[index]) {
while(true) {
vis[sta[tp]] = 0;
loc[sta[tp]] = index;
if(sta[tp] == index) break;
arr[index] += arr[sta[tp]];
tp--;
}
tp--;
}
}
struct node{
int from, to;
}edge[500100];
int to[500100];
int ans;
vector<int> vecnew[500100];
int temp[500100];
void dfs2(int index, int sum) {
sum = sum + arr[index];
if(sum<=temp[index]) return;
temp[index] = sum;
if(to[index]) {
ans = max(ans, sum);
}
// cout << index << "f" << vecnew[index].size() << endl;
for(int i=0; i<vecnew[index].size(); ++i) {
dfs2(vecnew[index][i], sum);
}
}
inline int read()
{
int x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
map<int, int> mp[500010];
signed main() {
// ios::sync_with_stdio(0); cin.tie(0);
n = read(), m = read();
for(int i=1; i<=m; ++i) {
int u, v; u = read(), v = read();
edge[i].from = u;
edge[i].to = v;
vec[u].push_back(v);
}
for(int i=1; i<=n; ++i) {
arr[i] = read();
}
for(int i=1; i<=n; ++i) {
if(!dfn[i]) {
dfs(i, 0);
}
}
// for(int i=1; i<=n; ++i) {
// cout << loc[i] << "d";
// }
// cout << endl;
for(int i=1; i<=m; ++i) {
if(mp[loc[edge[i].from]][loc[edge[i].to]]) {
continue;
}
mp[loc[edge[i].from]][loc[edge[i].to]] = 1;
if(loc[edge[i].from] != loc[edge[i].to])
vecnew[loc[edge[i].from]].push_back(loc[edge[i].to]);
}
int S, P;
cin >> S >> P;
for(int i=1; i<=P; ++i) {
int temp;
temp = read();
to[loc[temp]] = 1;
}
dfs2(loc[S], 0);
cout << ans;
return 0;
}
回复
共 7 条回复,欢迎继续交流。
正在加载回复...