请求加强数据
查看原帖
请求加强数据
920938
XingChen_MoNian楼主2025/8/4 11:13
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
#define int long long
using namespace std;
typedef long long ll;
inline ll read(){
    ll f=1,sum=0;char c=getchar();
    while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}
    while(isdigit(c)) {sum=sum*10+c-'0';c=getchar();}
    return sum*f;
}//快读
inline void print(ll x){
    if(x<0){putchar('-');x=-x;}
    if(x>9) print(x/10);
    putchar(x%10+'0');
}//快写
const int N=1e4+10;
vector<vector<int> > scc;
int dfn[N],low[N],id[N],cnt[N],ans[N],f[N],a[N],scca[N],timestamp,scccnt,n,m;
bool vis[N];
stack<int> st;
vector<int> vc[N],va[N];
vector<pair<int,int> > vv;
queue<int> q;
void tarjan(int u){
	dfn[u]=low[u]=timestamp++;
	vis[u]=1;
	st.push(u);
	for(int v:vc[u]){
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(vis[v]) low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		scccnt++;
		while(1){
			int v=st.top();
			st.pop();
			vis[v]=0;
			id[v]=scccnt;
			scca[scccnt]+=a[v];
			if(v==u) break;
		}
	}
}
void topu(){
	for(int i=1;i<=scccnt;i++){
		if(cnt[i]==0) q.push(i);
		ans[i]=scca[i];
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int v:va[u]){
			ans[v]=max(ans[v],ans[u]+scca[v]);
			if(--cnt[v]==0) q.push(v);
		}
	}
}
signed main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		if(u==v) continue;
		vc[u].push_back(v);
		vv.push_back({u,v});
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]) tarjan(i);
	}
	for(auto x:vv){
		int u=x.first,v=x.second;
		if(id[u]!=id[v]){
			va[id[u]].push_back(id[v]);
			cnt[id[v]]++;
		}
	}
	topu();
	int sum=0;
	for(int i=1;i<=scccnt;i++) sum=max(sum,ans[i]);
	cout<<sum;
	return 0;
}

此题代码这样写能过,但是是错误的,注意代码第34行是timestamp++,而timestamp初值为0,应改为++timestamp

2025/8/4 11:13
加载中...