tarjan + 拓扑 87pts 求调
查看原帖
tarjan + 拓扑 87pts 求调
694172
Dawn_chen楼主2024/1/24 21:19

RT。 WA on #3 #11。

提交记录。

代码如下:

#include <iostream>
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;
#define N 1000010
#define int long long

struct edge {
	int v, ne;
} a[N];

struct edgeedge {
	int to, ne;
} e[N];

queue <int> q;
stack <int> s;
int n, m, idx, indx, cl, tme, cen, p;
int low[N], dfn[N], val[N], vl[N], deg[N], col[N], hd[N], head[N], dis[N];
bool insta[N], ok[N], okk[N], vis[N];

void add(int u, int v) {
	a[ ++ idx].v = v; a[idx].ne = hd[u]; hd[u] = idx;
}

void pls(int u, int v) {
	e[ ++ indx].to = v; e[indx].ne = head[u]; head[u] = indx;	
}

void tarjan(int u) {
	low[u] = dfn[u] = ++ tme;
	insta[u] = true; s.push(u);
	
	for(int i = hd[u]; i; i = a[i].ne) {
		int v = a[i].v;
		if( ! dfn[v]) {
			tarjan(v); 
			low[u] = std::min(low[u], low[v]);
		}
		else if(insta[v]) low[u] = std::min(low[u], dfn[v]);
	}
	if(low[u] == dfn[u]) {
		cl ++;
		while(s.top() != u) {
			int v = s.top(); s.pop();
			col[v] = cl; vl[cl] += val[v];
			insta[v] = false;
			if(ok[v]) okk[cl] = true;
		} 
		s.pop(); col[u] = cl;
		vl[cl] += val[u];
		insta[u] = false;
		if(ok[u]) okk[cl] = true;
	}
}

void build() {
	for(int i = 1; i <= n; i ++) {
		for(int j = hd[i]; j; j = a[j].ne) {
			int u = col[i], v = col[a[j].v];
			if(u == v) continue;
			deg[v] ++;
			pls(u, v);
		}
	}
}

int topo(int fr) {
	for(int i = 1; i <= cl; i ++) dis[i] = vl[i];
	q.push(col[fr]);
	
	while( ! q.empty()) {
		int u = q.front(); q.pop();
		
		for(int i = head[u]; i; i = e[i].ne) {
			int v = e[i].to; 
			dis[v] = std::max(dis[u] + vl[v], dis[v]);
			deg[v] --; 
			if(deg[v] == 0) q.push(v);
		}
	}
	
	int ans = 0;
	for(int i = 1; i <= cl; i ++) {
		if(okk[i]) ans = std::max(ans, dis[i]);
	}
	
	return ans;
}

signed main() {
	//freopen("P3627_3.in", "r", stdin);
	ios::sync_with_stdio(false);
	cin >> n >> m;
	while(m --) {
		int x, y; cin >> x >> y;
		add(x, y);
	}
	for(int i = 1; i <= n; i ++) cin >> val[i];
	cin >> cen >> p;
	while(p --) {
		int x; cin >> x; ok[x] = 1;
	}
	
	tarjan(cen);
	build();
	
	cout << topo(cen);
	return 0;
}
2024/1/24 21:19
加载中...