社区讨论
玄关求条 原数据10pts Hack全对
P1073[NOIP 2009 提高组] 最优贸易参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @miye5vw4
- 此快照首次捕获于
- 2025/12/09 17:42 2 个月前
- 此快照最后确认于
- 2025/12/09 21:24 2 个月前
CPP
#include<bits/stdc++.h>
#define int long long
#define fst ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl '\n'
#define inf 1000000000000000000
using namespace std;
const int N=1e5+99;
int n,m;
vector<int>e[N],r[N];
int a[N],rnk[N];
int f[N];
bitset<N>vis;
void dfs(int u,int maxx){
if(f[u]){
return;
}
f[u]=maxx;
for(auto v:r[u]){
if(f[v]){
continue;
}
dfs(v,maxx);
}
}
signed main(){
fst;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
rnk[a[i]]=i;
}
for(int i=1;i<=m;i++){
int u,v,x;
cin>>u>>v>>x;
e[u].push_back(v);
r[v].push_back(u);
if(x==2){
e[v].push_back(u);
r[u].push_back(v);
}
}
auto bfs=[&](int s,vector<int>*e){
queue<int>q;
q.push(s);
vis.reset();
vis[s]=1;
while(q.size()){
int u=q.front();
f[u]+=s;
q.pop();
for(auto v:e[u]){
if(!vis[v]){
q.push(v);
vis[v]=1;
}
}
}
};
bfs(1,e);
bfs(n,r);
for(int i=1;i<=n;i++){
if(f[i]<n+1){
f[i]=inf;
}else{
f[i]=0;
}
}
sort(a+1,a+1+n,greater<int>());
for(int i=1;i<=n;i++){
if(f[i]!=inf&&a[i]>f[rnk[a[i]]]){
dfs(rnk[a[i]],a[i]);
}
}
int ans=0;
for(int i=1;i<=n;i++){
if(f[rnk[a[i]]]==inf){
continue;
}
ans=max(ans,f[rnk[a[i]]]-a[i]);
}
cout<<ans<<endl;
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...