求调
查看原帖
求调
643531
lx0311楼主2024/10/24 14:10

样例没过,但AC了

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,begin,end) for(ll i=(begin);i<=(end);++i)
const ll maxn=1e6+5, mod=1e9+7;
inline ll read(){
	ll f=0, k=1; char ch=getchar();
	while(ch<'0' || ch>'9'){ if(ch=='-') k=-1; ch=getchar();}
	while(ch>='0' && ch<='9'){ f=(f<<1)+(f<<3)+(ch-'0'); ch=getchar();}
	return f*k;
}
struct edge{
	ll u, v;
}e[maxn];
ll n, m, len, cnt, tot, ans, head[maxn], f[maxn], dfn[maxn], low[maxn];
ll a[maxn], b[maxn], c[maxn], x[maxn], y[maxn];
bool vis[maxn];
inline void add(ll u, ll v){
	e[++len].v=v;
	e[len].u=head[u];
	head[u]=len;
}
stack<ll> st;
void tarjan(ll u, ll fa){
	dfn[u]=low[u]=++tot;
	vis[u]=1;
	st.push(u);
	for(int i=head[u];i;i=e[i].u){
		ll v=e[i].v;
		if(v==fa) continue;
		if(!dfn[v]) tarjan(v,u), low[u]=min(low[u],low[v]);
		else if(vis[v]) low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		ll k;
		cnt++;
		do{
			k=st.top();
			st.pop();
			a[k]=cnt;
			b[cnt]+=c[k];
			vis[k]=0;
		}while(u!=k);
	}
}
void dfs(ll u){
	if(f[u]) return ;
	f[u]=b[u];
	ll res=0;
	for(int i=head[u];i;i=e[i].u){
		ll v=e[i].v;
		if(!f[v]) dfs(v);
		res=max(res,f[v]);
	}
	f[u]+=res;
}		
int main(){
	n = read(); m = read();
	FOR(i,1,n) c[i]=read();
	FOR(i,1,m){
		x[i]=read(), y[i]=read();
		add(x[i],y[i]);
	}
	FOR(i,1,n) if(!dfn[i]) tarjan(i,i);
	memset(head,0,sizeof head);
	memset(e,0,sizeof e);
	len=0;
	FOR(i,1,m) if(a[x[i]]!=a[y[i]]) add(a[x[i]],a[y[i]]);
	FOR(i,1,cnt) if(!f[i]) dfs(i), ans=max(ans,f[i]);
	cout << ans; 

	return 0;
} 
2024/10/24 14:10
加载中...