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