求助 缩点+拓扑排序 WA on #3
查看原帖
求助 缩点+拓扑排序 WA on #3
357163
shyr楼主2022/8/11 16:04
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
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;
}
int n, m, u, v, w, low[1000005], dfn[1000005], vis[1000005], tim, belong[1000005], sum[1000005], cnt, b[1000005], in[1000005], dp[1000005], S[1000005], st;
vector< pair<int, int> > d[1000005], d1[1000005]; 
stack<int> s;
void tarjan(int x){
	dfn[x] = low[x] = ++tim;
	vis[x] = 1; s.push(x);
	for(int i = 0; i < d[x].size(); ++i){
		int y = d[x][i].first;
		if(!dfn[y]){
			tarjan(y);
			low[x] = min(low[x], low[y]);
		}
		else if(vis[y]) low[x] = min(low[x], dfn[y]);
	}
	if(dfn[x] == low[x]){
		int y; ++cnt;
		do{
			y = s.top();
			s.pop();
			belong[y] = cnt;
			vis[y] = 0;
		}while(x != y);
	}
}
void toposort(){
	queue<int> q;
	st = belong[st];
	dp[st] = sum[st];
	q.push(st);
	while(q.size()){
		int x = q.front(); q.pop();
		for(int i = 0; i < d1[x].size(); ++i){
			int y = d1[x][i].first;
			dp[y] = max(dp[y], dp[x] + sum[y] + d1[x][i].second);
			if(--in[y] == 0) q.push(y);
		}
	}
	int ans = 0;
	for(int i = 1; i <= cnt; ++i) ans = max(ans, dp[i]);
	printf("%lld\n", ans); 
}
signed main(){
	for(int i = 1; i <= 50000; ++i) b[i] = b[i - 1] + i, S[i] = S[i - 1] + b[i];
	n = read(), m = read();
	for(int i = 1; i <= m; ++i){
		u = read(), v = read(), w = read();
		d[u].push_back(make_pair(v, w));
	}
	st = read();
	for(int i = 1; i <= n; ++i) if(!dfn[i]) tarjan(i);
	for(int i = 1; i <= n; ++i){
		for(int j = 0; j < d[i].size(); ++j){
			int y = d[i][j].first;
			w = d[i][j].second;
			if(belong[i] == belong[y]){
			//	printf("%d %d kk\n", lower_bound(b + 1, b + 1 + 50005, w) - b, S[lower_bound(b + 1, b + 1 + 50005, w) - b - 1]);
				sum[belong[i]] += d[i][j].second * (lower_bound(b + 1, b + 1 + 50005, w) - b) - S[lower_bound(b + 1, b + 1 + 50005, w) - b - 1];
			//	printf("%d %d\n", belong[i], sum[belong[i]]);
			} 
			else{
				d1[belong[i]].push_back(make_pair(belong[y], d[i][j].second));
				in[belong[y]]++;
			}
		}
	}
	toposort();
	return 0;
}

思路没有问题,求大佬看看细节实现哪里有错/kel/bx

2022/8/11 16:04
加载中...