社区讨论
tarjan+topo 样例过了0分求调
P3387【模板】缩点参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @logvgfo8
- 此快照首次捕获于
- 2023/11/02 15:35 2 年前
- 此快照最后确认于
- 2023/11/02 18:39 2 年前
CPP
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cmath>
#include<bitset>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<string>
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define pii pair<int,int>
#define mp(a,b) make_pair(a,b)
#define endl '\n'
using namespace std;
const int N=1e5+114;
vector<int>mp[N],nmp[N];
int n,k,low[N],dfn[N],num,val[N],dis[N],in[N];
int ans;
bool vis[N];
stack<int>s;
void tarjan(int u)
{
low[u]=dfn[u]=++num;
s.push(u),vis[u]=1;
for(int i=0;i<mp[u].size();++i)
{
int v=mp[u][i];
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else
{
if(vis[v])
{
low[u]=min(low[u],dfn[v]);
}
}
}
if(dfn[u]==low[u])
{
int k;
while(1)
{
k=s.top(),s.pop();
vis[k]=0;
if(u==k)break;
val[u]+=val[k];
}
}
}
void topo()
{
queue<int>q;
for(int i=1;i<=n;++i)
{
//cout<<i<<" "<<dfn[i]<<" "<<low[i]<<" "<<in[i]<<endl;
if(low[i]==dfn[i]&&in[i]==0)
{
//cout<<i<<endl;
q.push(i);
dis[i]=val[i];
}
}
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=0;i<nmp[u].size();++i)
{
int v=nmp[u][i];
dis[v]=max(dis[v],dis[u]+val[v]);
in[v]--;
if(in[v]==0)q.push(v);
}
}
for(int i=1;i<=n;++i)
{
ans=max(ans,dis[i]);
}
cout<<ans<<endl;
return ;
}
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void write(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
int main()
{
n=read(),k=read();
int u,v;
for(int i=1;i<=n;++i)
{
val[i]=read();
}
for(int i=1;i<=k;++i)
{
u=read(),v=read();
mp[u].push_back(v);
}
for(int i=1;i<=n;++i)
{
if(!dfn[i])tarjan(i);
}
for(int i=1;i<=n;++i)
{
for(int j=0;j<mp[i].size();++j)
{
if(low[i]!=low[mp[i][j]])
{
//cout<<low[i]<<"->"<<low[mp[i][j]]<<endl;
nmp[low[i]].push_back(low[mp[i][j]]);
in[low[mp[i][j]]]++;
}
}
}
topo();
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...