社区讨论

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 条回复,欢迎继续交流。

正在加载回复...