社区讨论

tarjan加spfa70ptswa on#4 5 7悬关求助

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lp0jycdv
此快照首次捕获于
2023/11/16 10:08
2 年前
此快照最后确认于
2023/11/16 13:46
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10,maxm=2*1e5+10;
int n,m,a[maxn],dfn[maxn],low[maxn],num,stac[maxn],ins[maxn],top,cnt,a1[maxn],sx[maxn],sy[maxn],c[maxn],d[maxn],MAX=-1,ru[maxn];
vector<int> t[maxn],t1[maxn];
bool vis[maxm],v[maxn][maxn];
void tarjan(int x,int fa){
	dfn[x]=low[x]=++num;
	stac[++top]=x,ins[x]=1;
	for(int i=0;i<t[x].size();i++){
		int y=t[x][i];
		if(!dfn[y]){
		tarjan(y,x);
		low[x]=min(low[x],low[y]);	
		}else if(ins[y]){
			low[x]=min(low[x],dfn[y]);
		}
	}
	if(dfn[x]==low[x]){
		cnt++;
		int y;
		do{
			y=stac[top--],ins[y]=0;
			c[y]=cnt,a1[cnt]+=a[y];
		}while(x!=y);
	}
}
queue<int> q;
void spfa(int root){
	memset(vis,0,sizeof(vis));
	memset(d,-0x3f,sizeof(d));
	d[root]=a1[root],vis[root]=1,q.push(root);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=0;i<t1[x].size();i++){
			int y=t1[x][i];
			if(d[y]<d[x]+a1[y]){
				d[y]=d[x]+a1[y];
				if(!vis[y]) vis[y]=1,q.push(y);
			}
		}
	}
	for(int i=1;i<=cnt;i++) MAX=max(MAX,d[i]);
}
int main(){
	freopen("P3387_4.in","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int x,y,i=1;i<=m;i++){
		scanf("%d%d",&sx[i],&sy[i]);
		t[sx[i]].push_back(sy[i]);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,0);
	for(int i=1;i<=n;i++){
		for(int j=0;j<t[i].size();j++){
			int y=t[i][j];
			if(c[y]==c[i]&&!v[c[i]][c[y]]) continue;
			v[c[i]][c[y]]=1;
			t1[c[i]].push_back(c[y]);
			ru[c[y]]++;
		}
	} 
	 /*for (int i=1;i<=m;++i) 
        if (c[sx[i]]!=c[sy[i]]) {    
            t1[c[sx[i]]].push_back(c[sy[i]]);
            ru[c[sy[i]]]++;   
            }*/
	for(int i=1;i<=cnt;i++) 
	if(ru[i]==0) 
	spfa(i);
	//q.push(),vis[c[i]]=1,d[c[i]]=a1[c[i]];
	cout<<MAX;
}
建边时将
CPP
	v[c[i]][c[y]]=1;
	t1[c[i]].push_back(c[y]);
	ru[c[y]]++;
改为t1[c[y]].push_back(c[i]);
则有80pts
求大佬条

回复

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

正在加载回复...