社区讨论
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 条回复,欢迎继续交流。
正在加载回复...