社区讨论
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 条回复,欢迎继续交流。
正在加载回复...