打了很久,过不了样例!!!
查看原帖
打了很久,过不了样例!!!
1064579
huhaoming2011楼主2024/3/12 13:14
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+100;
int n,m,cnt,dfcnt,dfn[MAXN],hd[MAXN],nxt[MAXN],to[MAXN],val[MAXN],low[MAXN],vis[MAXN];
int sc,scc[MAXN],sz[MAXN],bto[MAXN],d[MAXN],fro[MAXN],t[MAXN];
int hd2[MAXN],nxt2[MAXN],to2[MAXN],cnt2;
struct stac{
	int q[MAXN],tp;
	inline void init(){tp=0;}
	inline int top(){return q[tp];}
	inline void push(int x){q[++tp]=x;}
	inline void pop(){tp--;}
	inline int size(){return tp;}
	inline bool empty(){return tp>0?false:true;}
}st;
struct Queue{
	int q[MAXN],h,tail;
	inline void init(){tail=h=0;}
	inline int front(){return q[h+1];}
	inline int back(){return q[tail];}
	inline void push(int x){q[++tail]=x;}
	inline void pop(){h++;}
	inline int size(){return tail-h;}
	inline bool empty(){return h<tail?false:true;}
}q;
inline int mymin(int a,int b){return a<b?a:b;}
inline int mymax(int a,int b){return a>b?a:b;}
inline void add(int u,int v){
	cnt++;
	to[cnt]=v;
	nxt[cnt]=hd[u];
	hd[u]=cnt;
}
inline void add2(int u,int v){
	cnt2++;
	to2[cnt2]=v;
	nxt2[cnt2]=hd2[u];
	hd2[u]=cnt2;
}
inline void tarjan(int x){
	low[x]=dfn[x]=dfcnt++;
	st.push(x);
	vis[x]=1;
	for(int i=hd[x];i;i=nxt[i]){
		if(dfn[to[i]]==0){
			tarjan(to[i]);
			low[x]=mymin(low[x],low[to[i]]);
		}
		else if(vis[to[i]]!=0) low[x]=mymin(low[x],dfn[to[i]]);
	}
	if(dfn[x]==low[x]){
		sc++;
		while(!st.empty()){
			scc[st.top()]=sc;
			sz[sc]++;
			vis[st.top()]=0;
			st.pop();
		}
		scc[st.top()]=sc;
		sz[sc]++;
		vis[st.top()]=0;
		st.pop();
	}
}
inline int query(){
	int res=0;
	q.init();
	for(int i=1;i<=n;i++) if(scc[i]==i&&!bto[i]){
		q.push(i);
		d[i]=val[i];
	}
	while(!q.empty()){
		int ff=q.front();q.pop();
		for(int i=hd2[ff];i;i=nxt2[i]){
			int v=to2[i];
			d[v]=mymax(d[v],d[ff]+val[v]);
			bto[v]--;
			if(bto[v]==0) q.push(v); 
		}
	}
	for(int i=1;i<=n;i++) res=mymax(res,d[i]);
	return res;
}
int main(){
	st.init();
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&val[i]);
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
		fro[i]=u,t[i]=v;
	}
	for(int i=1;i<=n;i++) if(dfn[i]==0) tarjan(i);
	for(int i=1;i<=m;i++){
		int x=scc[fro[i]],y=scc[t[i]];
		if(x!=y){
			add2(x,y);
			bto[y]++;
		}
	}
	printf("%d",query());
	return 0;
}
2024/3/12 13:14
加载中...