求调,WA40pts
查看原帖
求调,WA40pts
1024529
sszxyyds楼主2023/9/19 21:34
#include<bits/stdc++.h>
using namespace std;
const int maxn=10015;
int n,m,sum,tim,top,s;
int p[maxn],hd[maxn],sd[maxn],dfn[maxn],low[maxn];
int sta[maxn],h[maxn],vis[maxn],in[maxn],dis[maxn];;
struct Edge{
	int from;int to;int nxt;
}edge[100150],ed[100150];
void add(int x,int y){
	edge[++sum].nxt=hd[x];
	edge[sum].from=x;
	edge[sum].to=y;
	hd[x]=sum;
}
void tarjan(int x){
	dfn[x]=low[x]=++tim;
	sta[++top]=x;vis[x]=1;
	for(int i=hd[x];i;i=edge[i].nxt){
		int v=edge[i].to;
		if(!dfn[v]){
			tarjan(v);
			low[x]=min(low[x],low[v]);
		}else{
			if(vis[v]){
				low[x]=min(low[x],dfn[v]);
			}
		}
		if(low[x]==dfn[x]){
			int y;
			while(y=sta[top--]){
				sd[y]=x;
				vis[y]=0;
				if(x==y){
					break;
				}
				p[x]+=p[y];
			}
		}
	}
}
int tuopu(){
	queue<int> q;
	int tot =0;
	for(int i=1;i<=n;i++){
		if(sd[i]==i&&!in[i]){
			q.push(i);
			dis[i]=p[i];
		}
	}
	while(q.size()){
		int k=q.front();q.pop();
		for(int i=h[k];i;i=ed[i].nxt){//rebuid a new map
			int v=ed[i].to;
			dis[v]=max(dis[v],p[v]+dis[k]);
			in[v]--;
			if(in[v]==0){
				q.push(v);
			}
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		ans=max(ans,dis[i]);
	}
	return  ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&p[i]);
	}
	for(int i=1;i<=m;i++){
		int xx,yy;
		scanf("%d%d",&xx,&yy);
		add(xx,yy);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			tarjan(i);
		}
	}
	for(int i=1;i<=m;i++){
		int x=sd[edge[i].from],y=sd[edge[i].to];
		if(x!=y){
		ed[++s].nxt=h[x];	
		ed[s].to=y;
		ed[s].from=x;
		h[x]=s;
		in[y]++;	
	}
	printf("%d",tuopu());
	return 0; 
	}
}
2023/9/19 21:34
加载中...