社区讨论

玄关求条 原数据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 条回复,欢迎继续交流。

正在加载回复...