进食后人
查看原帖
进食后人
1067963
Linqy_juruo楼主2024/10/5 15:19

如果你是 Tarjan + SPFA 做法,且 _87pts_如下

评测记录

只需将 SPFA 中的 vis 数组删除即可

具体如下:


#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m,st,pt,ans;
struct edge1{
   int to,nex;
}e1[N];
int head1[N],cnt1;
struct edge2{
   int to,nex;
}e2[N];
int head2[N],cnt2;
int point[N];
int low[N],dfn[N],vis[N],num;
int p[N],tot,dis[N],bar[N],w[N];
stack<int>s;
void add1(int u,int v){
   e1[++cnt1].to=v;
   e1[cnt1].nex=head1[u];
   head1[u]=cnt1;
}
void add2(int u,int v){
   e2[++cnt2].to=v;
   e2[cnt2].nex=head2[u];
   head2[u]=cnt2;
}
void Tarjan(int u){
   low[u]=dfn[u]=++num;
   vis[u]=1;
   s.push(u);
   for(int i=head1[u];i!=0;i=e1[i].nex){
   	int v=e1[i].to;
   	if(!dfn[v]){
   		Tarjan(v);
   		low[u]=min(low[u],low[v]);
   	}
   	else if(vis[v])low[u]=min(low[u],dfn[v]);
   }
   if(dfn[u]==low[u]){
   	++tot;
   	int k=0;
   	while(k!=u){
   		k=s.top(); 
   		s.pop();
   		p[k]=tot;
   		vis[k]=0; 
   	}
   }
}
void scc(){
   for(int u=1;u<=n;u++){
   	for(int j=head1[u];j!=0;j=e1[j].nex){
   		int v=e1[j].to;
   		if(p[u]!=p[v])add2(p[u],p[v]);
   	}
   }
}
void Spfa(){
   //memset(vis,0,sizeof vis);
   dis[p[st]]=w[p[st]];
   queue<int>q;
   q.push(p[st]);
   //vis[st]=true;
   while(!q.empty()){
   	int u=q.front();
   	q.pop();
   //	if(vis[u])continue;
   //  vis[u]=true;
   	for(int j=head2[u];j!=0;j=e2[j].nex){
   		int v=e2[j].to;
   		if(dis[u]+w[v]>dis[v]){
   			dis[v]=dis[u]+w[v];
   			//if(!vis[v])
   			q.push(v);
   		}
   	}
   }
}
int main(){
   cin>>n>>m;
   for(int i=1;i<=m;i++){
   	int u,v;
   	cin>>u>>v;
   	add1(u,v);
   }
   for(int i=1;i<=n;i++)cin>>point[i];
   cin>>st>>pt;
   for(int i=1;i<=pt;i++){
   	int x;
   	cin>>x;
   	bar[x]=1;
   }
   for(int i=1;i<=n;i++)
   	if(!dfn[i])Tarjan(i);
   scc();
   for(int i=1;i<=n;i++){
   	w[p[i]]+=point[i];
   	if(bar[i])bar[p[i]]=1;
   }
   Spfa();
   for(int i=1;i<=tot;i++)
   	if(bar[i])ans=max(ans,dis[i]);//cout<<dis[i]<<' ';
   cout<<ans;
   return 0;
}

(调了 2.5 小时的码 (bushi

2024/10/5 15:19
加载中...