社区讨论

P4742(WA*5) 玄关!

题目总版参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lzl93xh0
此快照首次捕获于
2024/08/08 20:25
2 年前
此快照最后确认于
2024/08/08 21:19
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
long long n,m,cnt=0,k[N];
int id[N],u[N],v[N],in[N],e_in[N];
int head[N],ver[N*20],Next[N*20],num=0;
int low[N],dfn[N],tot=0;
long long st[N],sum[N],poi[N],dis[N],maxn[N],tp=0;
int e_head[N],e_ver[N*20],e_next[N*20],e_num=0; 
void add(int u,int v){
	ver[++num]=v;
	Next[num]=head[u];
	head[u]=num;
}
void e_add(int u,int v){
	e_ver[++e_num]=v;
	e_next[e_num]=e_head[u];
	e_head[u]=e_num;
}
void tarjan(int u){
	in[u]=1;
	low[u]=dfn[u]=++tot;
	st[++tp]=u;
	for(int i=head[u];i;i=Next[i]){
		int v=ver[i];
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(in[v]){
			low[u]=min(low[u],dfn[v]);
		}
	}
	if(low[u]==dfn[u]){
		cnt++;
		int z;
		while(st[tp+1]!=u){
			int z=st[tp--];
			in[z]=0;
			id[z]=cnt;
			sum[cnt]+=k[z];
			poi[cnt]=max(poi[cnt],k[z]);
		}
	}
}
void topo(){
	queue<int> q;
	while(!q.empty()){
		q.pop();
	}
	for(int i=1;i<=cnt;i++){
		dis[i]=sum[i];
		maxn[i]=poi[i];
		if(!e_in[i]){
			q.push(i);
		} 
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=e_head[u];i;i=e_next[i]){
			int v=e_ver[i];
			if(dis[u]+sum[v]>dis[v]){
				dis[v]=dis[u]+sum[v];
				maxn[v]=max(poi[v],maxn[u]);
			}
			else if(dis[u]+sum[v]==dis[v]){
				maxn[v]=max(maxn[v],maxn[u]);
			}
			if(--e_in[v]==0){
				q.push(v);
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>k[i];
	}
	for(int i=1;i<=m;i++){
		cin>>u[i]>>v[i];
		add(u[i],v[i]);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			tarjan(i);
		}
	}
	for(int i=1;i<=m;i++){
		if(id[u[i]]!=id[v[i]]){
			e_in[id[v[i]]]++;
			e_add(id[u[i]],id[v[i]]);
		}
	}
	topo();
	long long nn=0,mm=0;
	for(int i=1;i<=cnt;i++){
		if(dis[i]>nn){
			nn=dis[i];
			mm=maxn[i];
		}
		else if(dis[i]==nn){
			mm=max(mm,maxn[i]);
		}
	}
	cout<<nn<<" "<<mm;
	fclose(stdin);
	fclose(stdout);
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...