#2 #3 #10 RE求调
查看原帖
#2 #3 #10 RE求调
774635
Supernova_empire楼主2024/7/26 16:46

bfs用stl要mle

#include <bits/stdc++.h>
using namespace std;
int n,m;
int s;
bool pub[1000005];
int bank[1000005];
int h[1000005],ne[1000005],e[1000005],idx;
void add(int u,int v){
	e[idx]=v,ne[idx]=h[u],h[u]=idx++;
}
//
int h2[1000005],ne2[1000005],e2[1000005],idx2;
inline void add2(int u,int v){
	e2[idx2]=v,ne2[idx2]=h2[u],h2[u]=idx2++;
}
inline void readin(){
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);
	}
	for(int i=1;i<=n;i++) cin>>bank[i];
	int r;
	cin>>s>>r;
	for(int i=1;i<=r;i++){
		int t;
		cin>>t;
		pub[t]=1;
	}
}
//
int tc=0;
int cnt=0;
int c[1000005];
int mem[1000005];
int prc[1000005];
bool ins[1000005];
stack<int>st;
vector<int>vct[1000005];
int dfn[1000005],low[1000005];
inline void tarjan(int x){
	//cout<<"at"<<x<<"\n";
	dfn[x]=low[x]=++tc;
	ins[x]=1,st.push(x);
	for(int i=h[x];~i;i=ne[i]){
		int y=e[i];
		//cout<<"at"<<x<<'\n';
		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}else if(ins[y]){
			low[x]=min(low[x],dfn[y]);
		}
	}
	//printf("over round 1 of %d\n",x);;
	if(dfn[x]==low[x]){
		cnt++;
		int y;
		vct[cnt].push_back(0);
		do{
			//cout<<1<<"of"<<x<<endl;
			y=st.top(),st.pop();
			ins[y]=0;
			if(pub[y]) vct[cnt][0]=1;
			c[y]=cnt;
			mem[cnt]++;
			prc[cnt]+=bank[y];
			vct[cnt].push_back(y);
		}while(x!=y);
	}
}
int in[1000005];
int out[1000005];
inline void reuse(){
	for(int i=1;i<=n;i++){
		for(int j=h[i];~j;j=ne[j]){
			int p=e[j];
			if(c[i]==c[p]) continue;
			if(c[i]==0||c[p]==0) continue;
			add2(c[i],c[p]);
			in[c[p]]++;
			out[c[i]]++;
		} 
	} 
}
int ans=0;
int money[1000005];
int q[5000005];
int pi=0;
int po=1;
inline void bfs(int s){
	money[s]=prc[s];
	pi++;
	q[pi]=s;
	while(pi>=po){
		int nowp=q[po];
		po++;
		if(vct[nowp][0]) ans=max(ans,money[nowp]);
		for(int i=h2[nowp];~i;i=ne2[i]){
			int nexp=e2[i];
			money[nexp]=max(money[nexp],money[nowp]+prc[nexp]);
			pi++;
			q[pi]=nexp;
		}
	}
}
int main(){
	ios::sync_with_stdio(false),
	cin.tie(0),
	cout.tie(0);
	memset(h,-1,sizeof h);
	memset(h2,-1,sizeof h2);
	cin>>n>>m;
	readin();
	//puts("1");
	tarjan(s);
	//puts("2");
	reuse();
	/*
	//puts("3");
	puts("\n\ncnt+point\n");
	for(int i=1;i<=cnt;i++){
		cout<<i<<"  :\t";
		for(int j=1;j<=mem[i];j++){
			cout<<vct[i][j]<<'\t';
		}
		puts("\nend");
	}
	puts("pubs");
	for(int i=1;i<=cnt;i++) cout<<vct[i][0]<<'\t';
	puts("\nroads");
	for(int i=1;i<=cnt;i++){
		for(int j=h2[i];~j;j=ne2[j]){
			printf("%d\tto\t%d\n",i,e2[j]);
		}
	}
	printf("s at %d\n",c[s]);
	for(int i=1;i<=cnt;i++) cout<<prc[i]<<'\t';
	puts("\nans : \n");
	*/
	bfs(c[s]);
	cout<<ans;
	return 0;
}
2024/7/26 16:46
加载中...