社区讨论

60ptsHelp!

P3387【模板】缩点参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mi7z5sxo
此快照首次捕获于
2025/11/21 06:00
3 个月前
此快照最后确认于
2025/11/21 06:00
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>

using namespace std;

#define maxn 10003
#define maxm 100003

int n,m,wy[maxn],wn[maxn],x,y;
int dfn[maxn],low[maxn],st[maxn],top,ind,cnt,id[maxn];
bool ins[maxn];
int vy[maxm],vn[maxm],toty,totn,Headn[maxn],Heady[maxn],Nexty[maxm],Nextn[maxm];
struct node{
	int x,y;
	bool operator <(node a)const{
		return a.x<x;
	}
};
set <node> s;
int rd[maxn],tp[maxn],tql,fr=1,opt[maxn];
int ans;

template<typename Tp>
void read(Tp &x){
	x=0;char ch=0;int fh;
	while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
	if(ch=='-'){
		ch=getchar();fh=-1;
	}
	else fh=1;
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	x*=fh;
}

void tarjan(int x){
	dfn[x]=low[x]=++ind;st[++top]=x;ins[x]=1;
	for(int i=Heady[x];i;i=Nexty[i]){
		if(dfn[vy[i]]){
			if(ins[vy[i]]){
				low[x]=min(low[x],dfn[vy[i]]);
			}
		}
		else{
			tarjan(vy[i]);
			low[x]=min(low[x],low[vy[i]]);
		}
	}
	if(low[x]==dfn[x]){
		++cnt;
		while(st[top]!=x){
			id[st[top]]=cnt;ins[st[top--]]=0;
		}
		id[st[top--]]=cnt;ins[x]=0;
	}
}

int main(){
	read(n);read(m);
	for(int i=1;i<=n;i++){
		read(wy[i]);
	}
	for(int i=1;i<=m;i++){
		read(x);read(y);
		vy[++toty]=y,Nexty[toty]=Heady[x],Heady[x]=toty;
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]) tarjan(i);
	}
	for(int i=1;i<=n;i++){
		for(int j=Heady[i];j;j=Nexty[j]){
			if(id[i]==id[vy[j]]) continue;
			if(s.count((node){id[i],id[vy[j]]})) continue;
			s.insert((node){id[i],id[vy[j]]});
			vn[++totn]=id[vy[j]],Nextn[totn]=Headn[id[i]],Headn[id[i]]=totn;
			rd[id[vy[j]]]++;
		}
		wn[id[i]]+=wy[i];
	}
	for(int i=1;i<=cnt;i++){
		if(!rd[i]){
			tp[++tql]=i;
		}
		opt[i]=wn[i];
	}
	while(fr<=tql){
		int k=tp[fr++];
		for(int i=Headn[k];i;i=Nextn[i]){
			rd[vn[i]]--;
			if(!rd[vn[i]]) tp[++tql]=vn[i];
			opt[vn[i]]=max(opt[vn[i]],opt[k]+wn[vn[i]]);
		}
	}
	for(register int i=1;i<=cnt;i++){
		ans=max(ans,opt[i]);
	}
	printf("%d\n",ans);
	return 0;
}
WA on #3 4 5 7

回复

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

正在加载回复...