大佬帮忙调一下代码啊qwq,,,,,
查看原帖
大佬帮忙调一下代码啊qwq,,,,,
999304
Snowday楼主2025/8/3 14:12
#include<bits/stdc++.h>
using namespace std;

#define _for(i , a , b) for(int i = a ; i <= b ; i ++)
#define for_(i , a , b) for(int i = a ; i >= b ; i --)
#define ls k << 1
#define rs k << 1 | 1
#define inf 0x3f3f3f3f
#define fir first
#define sec second
const int maxn = 1e6 + 10;
vector<int>v[maxn];
vector<int>v2[maxn];
int n,m,tp,cnt,num;
int w[maxn],dfn[maxn],low[maxn],vis[maxn],st[maxn],id[maxn],max_num[maxn],sum[maxn],rd[maxn];
pair<int,int>dist[maxn];
void tarjan(int u){
	st[++ tp] = u;
	vis[u] = 1;
	dfn[u] = low[u] = ++ cnt;
	for(auto itr:v[u]){
		if(!dfn[itr]) {
			tarjan(itr);
			low[u] = min(low[u],low[itr]);
		}
		else low[u] = min(low[u],low[itr]);
	}
	if(dfn[u] == low[u]){
		++ num;
		while(st[tp] != u) {
			vis[st[tp]] = 0;
			id[st[tp]] = num;
			max_num[num] = max(max_num[num],w[st[tp]]);
			sum[num] += w[st[tp]];
			-- tp;
		}
		vis[st[tp]] = 0;
		id[st[tp]] = num;
		max_num[num] = max(max_num[num],w[st[tp]]);
		sum[num] += w[st[tp]];
		-- tp;
	}
}
void topo_sort(){
	queue<int>q;
	_for(i , 1 , num){
		if(rd[i] == 0) q.push(i),dist[i] = {sum[i],max_num[i]};
	}
	while(!q.empty()){
		int u = q.front();
		q.pop();
		for(auto itr:v2[u]){
				dist[itr].fir = dist[u].fir + sum[itr];
				dist[itr].sec = max(dist[itr].sec,max_num[itr]);
				q.push(itr);
		}
	}
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin >> n >> m;
	_for(i , 1 , n) cin >> w[i];
	_for(i , 1 , m) {
		int x,y;
		cin >> x >> y;
		v[x].push_back(y);
	}	
	_for(i , 1 , n){
		if(!dfn[i]) tarjan(i);
	}
	_for(i , 1 , n){
		for(auto itr:v[i]){
			if(id[i] != id[itr]){
				v2[id[i]].push_back(id[itr]);
				rd[id[itr]] ++;
			}
		}
	}
	topo_sort();
	sort(dist + 1,dist + 1 + num);
	cout << dist[num].fir << ' ' << dist[num].sec;
	return 0;
}
2025/8/3 14:12
加载中...