社区讨论
50分求助
P1073[NOIP 2009 提高组] 最优贸易参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m5qa2lya
- 此快照首次捕获于
- 2025/01/10 12:49 去年
- 此快照最后确认于
- 2025/11/04 11:48 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
int m,n,cnt,low[1000005],dfn[1000005],f[1000005],a[1000005],cnt2,c[1000005],dp[1000005][2],vis[1000005];
int k,x,y;
vector<int> e[1000005];
stack<int> s;
struct node{
int maxx,minn;
}o[1000005];
queue<int> q;
void tarjan(int x){
low[x]=dfn[x]=++cnt;
vis[x]=1;
s.push(x);
for(int i=0;i<e[x].size();i++){
if(!dfn[e[x][i]]){
tarjan(e[x][i]);
low[x]=min(low[x],low[e[x][i]]);
}else{
if(vis[e[x][i]]) {
low[x]=min(low[x],low[e[x][i]]);
}
}
}
if(low[x]==dfn[x]){
++cnt2;
o[cnt2].maxx=-1000;
o[cnt2].minn=1000;
while(1){
f[s.top()]=cnt2;
o[cnt2].maxx=max(o[cnt2].maxx,a[s.top()]);
o[cnt2].minn=min(o[cnt2].minn,a[s.top()]);
vis[s.top()]=0;
if(s.top()==x){
s.pop();
break;
}
s.pop();
}
}
}
int main(){
scanf("%d%d",&n,&m);
cnt2=n;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&k);
e[x].push_back(y);
if(k==2) e[y].push_back(x);
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
tarjan(i);
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<e[i].size();j++){
e[f[i]].push_back(f[e[i][j]]);
c[f[e[i][j]]]++;
}
}
q.push(f[1]);
for(int i=n+1;i<=cnt2;i++){
dp[i][1]=o[i].minn;
dp[i][0]=o[i].maxx-o[i].minn;
}
while(!q.empty()){
int v=q.front();
q.pop();
for(int i=0;i<e[v].size();i++){
c[e[v][i]]--;
dp[e[v][i]][1]=min(dp[e[v][i]][1],dp[v][1]);
dp[e[v][i]][0]=max(max(dp[e[v][i]][0],o[e[v][i]].maxx-dp[e[v][i]][1]),dp[v][0]);
if(c[e[v][i]]==0){
q.push(e[v][i]);
}
}
}
// for(int i=n+1;i<=cnt2;i++){
// cout<<dp[i][1]<<endl;
// }
cout<<dp[f[n]][0];
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...