社区讨论

70pts求调

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhj20i5h
此快照首次捕获于
2025/11/03 19:25
4 个月前
此快照最后确认于
2025/11/03 19:25
4 个月前
查看原帖
#4、#5、#7没过
CPP
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define endl '\n'
//#define int long long
using namespace std;
int n,m,cnt,scc[10010],a[10010],an,anv[10010],fr[100010],to[100010],in[10010],dp[10010],final_ans;
bool vis[10010];
vector<int>e1[10010],e2[10010],ans[10010];
stack<int>st;
map<pii,bool>ma;
queue<int>q;
void dfs1(int u){
	vis[u]=1;
	for(auto v:e1[u])
		if(!vis[v])
			dfs1(v);
	st.push(u);
} 
void dfs2(int u){
	scc[u]=cnt;
	an+=a[u];
	for(auto v:e2[u])
		if(!scc[v])
			dfs2(v);
}
void kosaraju(){
	for(int i=1;i<=n;i++)
		dfs1(i);
	while(!st.empty()){
		int u=st.top();
		st.pop();
		if(!scc[u]){
			an=0;
			cnt++;
			dfs2(u);
			anv[cnt]=an;
		}
	}
}
signed main(){
//	freopen("a.in","r",stdin);
//	freopen("output.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
//	cout<<fixed<<setprecision(2);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=m;i++){
		cin>>fr[i]>>to[i];
		e1[fr[i]].push_back(to[i]);
		e2[to[i]].push_back(fr[i]);
	}
	kosaraju();					//求强连通分量 
	for(int i=1;i<=m;i++)		//建新图 
		if(!ma[{scc[fr[i]],scc[to[i]]}]&&scc[fr[i]]!=scc[to[i]]){	//去重边&自环 
			ma[{scc[fr[i]],scc[to[i]]}]=1;
			ans[scc[fr[i]]].push_back(scc[to[i]]);
			in[scc[to[i]]]++;
		}
//调试 
//	cout<<cnt<<endl;
//	cout<<"anv[]:"<<endl;
//	for(int i=1;i<=cnt;i++)
//		cout<<anv[i]<<" ";
//	cout<<endl;
//	cout<<"in[]:"<<endl;
//	for(int i=1;i<=cnt;i++)
//		cout<<in[i]<<" ";
//	cout<<endl;
//	for(int i=1;i<=cnt;i++){
//		cout<<i<<":"<<endl;
//		for(auto j:ans[i])
//			cout<<"    "<<i<<" to "<<j<<endl;
//		cout<<endl;
//	}
	for(int i=1;i<=cnt;i++)		//dp 
		if(!in[i]){
			q.push(i);
			dp[i]=anv[i];
		}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(auto v:ans[u]){
			dp[v]=max(dp[v],dp[u]+anv[v]);
			if(--in[v]==0)
				q.push(v);
		}
	}
	for(int i=1;i<=cnt;i++)
		final_ans=max(final_ans,dp[i]);
	cout<<final_ans<<endl;
	return 0;
}

回复

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

正在加载回复...