关于过不了样例却可以A的怪事
查看原帖
关于过不了样例却可以A的怪事
365110
xuanyuan_Niubi楼主2021/1/26 22:00

P3627劫掠计划

#include<cstdio>
#include<stack>
#include<cstring>
#include<queue>
using namespace std;
const int M=500005;
struct edge{
	int u,v,nxt;
}ed[M],en[M];
int head[M],cnt,n,m,st,end[M],p,a[M],w[M];
int dfn[M],low[M],color[M],dex,sum;
int dis[M];
bool vis[M],visi[M],visit[M];
stack<int>s;
inline int read(){
	char c=getchar();int x=0;
	while(c<'0'||c>'9')c=getchar();
	while(c<='9'&&c>='0'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x;
}
inline void add(int u,int v){
	ed[++cnt]=(edge){u,v,head[u]};
	head[u]=cnt;
}
inline void add_new(int u,int v){
	en[++cnt]=(edge){u,v,head[u]};
	head[u]=cnt;
}
inline void tarjan(int now){
	dfn[now]=low[now]=++dex;
	vis[now]=true;
	s.push(now);
	for(int i=head[now];i;i=ed[i].nxt){
		int v=ed[i].v;
		if(!dfn[v]){
			tarjan(v);
			low[now]=min(low[now],low[v]);
		}
		else if(vis[v]){
			low[now]=min(low[now],dfn[v]);
		}
	}
	if(dfn[now]==low[now]){
		int t;
		sum++;
		do{
			t=s.top();
			s.pop();
			color[t]=sum;
			vis[t]=false;
		}while(t!=now);
	}
}
inline void spfa_long(int st){
	memset(dis,-1,sizeof(dis));
	queue<int>q;
	q.push(st);
	dis[st]=w[st];
	visi[st]=true;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		visi[u]=false;
		for(int i=head[u];i;i=en[i].nxt){
			int v=en[i].v;
			if(dis[v]<dis[u]+w[v]){
				dis[v]=dis[u]+w[v];
				if(!visi[v]){
					visi[v]=true;
					q.push(v);
				}
			}
		}
	}
}
int main(){
	n=read();m=read();
	for(int i=1;i<=m;i++){
		int u=read(),v=read();
		add(u,v);
	}
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	st=read();p=read();
	for(int i=1;i<=p;i++){
		end[i]=read();
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			tarjan(i);
		}
	}
	cnt=0;
	memset(head,0,sizeof(head));
	for(int i=1;i<=m;i++){
		int u=ed[i].u,v=ed[i].v;
		if(color[u]==color[v]){
			if(!visit[u]){
				w[color[u]]+=a[u];
				visit[u]=true;
			}
			if(!visit[v]){
				w[color[v]]+=a[v];
				visit[v]=true;
			}
		}
		else{
			add_new(color[u],color[v]);
		}
	}
	spfa_long(color[st]);
	int ans=0;
	for(int i=1;i<=p;i++){
		ans=max(ans,dis[color[end[i]]]);
	}
	printf("%d",ans);
	return 0;
}

真就过不了样例,但真就过了。 求问为什么样例过不了。

2021/1/26 22:00
加载中...