是拿到CF上面提交的,TLE on 4#
#include <bits/stdc++.h>
#define N 200005
using namespace std;
int t,n,m,u,v,cnt,tot;
int a[N],dfn[N],low[N],scc[N],g[N],in[N],f[N];
long long l[N],w[N];
bool instack[N];
stack<int> sta;
vector<int> e[N],edge[N];
void init(){
cnt=tot=0;
memset(dfn,0,sizeof dfn);
memset(low,0,sizeof low);
memset(scc,0,sizeof scc);
memset(w,0,sizeof w);
memset(in,0,sizeof in);
memset(g,0,sizeof g);
memset(instack,0,sizeof instack);
for (int i=1;i<=n;i++){
e[i].clear();
edge[i].clear();
}
}
void tarjan(int u){
dfn[u]=low[u]=++cnt;
instack[u]=1;
sta.push(u);
for (int v:e[u]){
if (!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}else if (instack[v]){
low[u]=min(low[u],dfn[v]);
}
}
if (low[u]==dfn[u]){
tot++;
int tp=0;
while (tp!=u){
tp=sta.top();
scc[tp]=tot;
w[tot]+=a[tp];
g[tot]++;
instack[tp]=0;
sta.pop();
}
}
}
void topo(){
queue<int> q;
int len=0;
long long ans=LONG_LONG_MAX;
memset(l,0,sizeof l);
memset(f,0,sizeof f);
for (int i=1;i<=tot;i++){
if (!in[i]){
q.push(i);
f[i]=g[i];
l[i]=w[i];
len=max(len,f[i]);
}
}
while (!q.empty()){
int u=q.front();
q.pop();
for (int v:edge[u]){
in[v]--;
if (f[u]+g[v]>f[v]){
f[v]=f[u]+g[v];
l[v]=l[u]+w[v];
len=max(len,f[v]);
}else if (f[u]+g[v]==f[v]){
l[v]=min(l[v],l[u]+w[v]);
}
if (!in[v]){
q.push(v);
}
}
}
for (int i=1;i<=tot;i++){
if (f[i]==len){
ans=min(ans,l[i]);
}
}
cout<<len<<" "<<ans<<endl;
}
signed main(){
for (cin>>t;t;t--){
init();
cin>>n>>m;
for (int i=1;i<=n;i++){
cin>>a[i];
}
while (m--){
cin>>u>>v;
if (u==v){
continue;
}
e[u].push_back(v);
}
for (int i=1;i<=n;i++){
if (!dfn[i]){
tarjan(i);
}
}
for (int u=1;u<=n;u++){
//cout<<u<<" "<<scc[u]<<endl;
for (int v:e[u]){
if (scc[u]==scc[v]){
continue;
}
//cout<<scc[u]<<" "<<scc[v]<<endl;
edge[scc[u]].push_back(scc[v]);
in[scc[v]]++;
}
}
topo();
}
}