kosaraju 20pts, Tarjan 0pts 蒟蒻求助!!!
查看原帖
kosaraju 20pts, Tarjan 0pts 蒟蒻求助!!!
511042
Edwin_liannan楼主2022/2/26 22:02
//kosaraju
#include<bits/stdc++.h>
using namespace std;
int n,m,x[10005],y[10005],a[10005],st[10005],c[10005],ans,t;
vector<int> e1[10005],e2[10005],e3[10005];
bool vis[10005];
int f[10005],team[10005];
void dfs(int x){
	vis[x]=1;
	for(int i=0;i<e1[x].size();i++) if(!vis[e1[x][i]]) dfs(e1[x][i]);
	st[++t]=x;
}
void dfs2(int x){
	team[x]=t,c[t]+=a[x];
	for(int i=0;i<e2[x].size();i++) if(!team[e2[x][i]]) dfs2(e2[x][i]);
}
void dp(int x){
	if(f[x]) return;
	for(int i=0;i<e3[x].size();i++){
		if(!f[e3[x][i]]) dp(e3[x][i]);
		f[x]=max(f[x],f[e3[x][i]]);
	}
	f[x]+=c[x];
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>x[i]>>y[i],e1[x[i]].push_back(y[i]),e2[y[i]].push_back(x[i]);
	for(int i=1;i<=n;i++) if(!vis[i]) dfs(i);
	t=0;
	for(int i=n;i>=1;i--) if(!team[st[i]]) t++,dfs2(st[i]);
	memset(vis,0,sizeof vis);
	for(int i=1;i<=m;i++) if(team[x[i]]!=team[y[i]]) e3[team[x[i]]].push_back(team[y[i]]);
	for(int i=1;i<=t;i++) dp(i),ans=max(ans,f[i]);
	cout<<ans;
	return 0;
}
//Tarjan
#include<bits/stdc++.h>
using namespace std;

#define mn 10005
#define mm 100005
int cnt,tot,n,m,ans;
int sum[mn],f[mn],x[mn],y[mn],a[mn],val[mn];
int team[mn],st[mn],in[mn],dfn[mn],low[mn],top;
struct Edge{
	int h[mm],to[mm],w[mm],nxt[mm],t;
	inline void add(int x,int y,int z){
		nxt[++t]=h[x];to[t]=y;w[t]=z;h[x]=t;
	}
	inline void init(){
		memset(h,0,sizeof h);
		memset(to,0,sizeof to);
		memset(w,0,sizeof w);
		memset(nxt,0,sizeof nxt);
		t=0;
	}
}e;

void tarjan(int u){
	st[++top]=u;in[u]=1;
	dfn[u]=low[u]=++cnt;
	for(int i=e.h[u];i;i=e.nxt[i]){
		int v=e.to[i];
		if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
		else if(in[v]) low[u]=min(low[u],low[v]);
	}
	if(dfn[u]==low[u]){
		tot++;
		while(st[top]!=u) team[st[top]]=tot,sum[tot]+=val[st[top]],in[st[top--]]=0;
	}
}

void dp(int u){
	if(f[u]) return;
	f[u]=sum[u];
	int ms=0;
	for(int i=e.h[u];i;i=e.nxt[i]){
		if(!f[e.to[i]]) dp(e.to[i]);
		ms=max(ms,f[e.to[i]]);
	}
	f[u]+=ms;
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>x[i]>>y[i],e.add(x[i],y[i],1);
	for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
	e.init();
	for(int i=1;i<=m;i++) if(team[x[i]]!=team[y[i]]) e.add(team[x[i]],team[y[i]],1);
	for(int i=1;i<=tot;i++) if(!f[i]) dp(i),ans=max(ans,f[i]);
	cout<<ans;
	return 0;
}

蒟蒻太弱了,先是kosaraju Re+Wa,再是Tarjan MLE+WA!求神仙大佬们帮忙!

2022/2/26 22:02
加载中...