社区讨论

80pts分层图最长路求调

P1073[NOIP 2009 提高组] 最优贸易参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhj42slw
此快照首次捕获于
2025/11/03 20:23
4 个月前
此快照最后确认于
2025/11/03 20:23
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
struct node{
	int u,k,d;
	bool operator<(const node other)const{
		return d<other.d;
	}
};
int n,m;
int p[maxn];
int dis[maxn*3],vis[maxn*3];
vector<int> e[maxn*3];
void dijkstra(){
	memset(dis,-0x3f,sizeof dis);
	priority_queue<node> pq;
	dis[1]=0;
	pq.push({1,0,0});
	while(!pq.empty()){
		auto[u,k,d]=pq.top();
		pq.pop();
		if(vis[u+n*k])continue;
		vis[u+n*k]=true;
		for(auto v:e[u+n*k]){
			int ndis=d;
			if(k==0&&(v-1)/n==1){
				ndis=d-p[u];
			}else if(k==1&&(v-1)/n==2){
				ndis=d+p[u];
			}else if(k==(v-1)/n){
				ndis=d;
			}else continue;
			if(ndis>dis[v]){
				dis[v]=ndis;
				pq.push({(v-1)%n+1,(v-1)/n,ndis});
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>p[i];
	}
	for(int i=1,u,v,op;i<=m;i++){
		cin>>u>>v>>op;
		for(int k=0;k<3;k++){
			e[u+k*n].push_back(v+k*n);
			if(op==2)e[v+k*n].push_back(u+k*n);
		}
		e[u].push_back(v+n);
		e[u+n].push_back(v+n*2);
		if(op==2){
			e[v].push_back(u+n);
			e[v+n].push_back(u+n*2);
		}
	}
	dijkstra();
	cout<<max(0,dis[n*3])<<endl;
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...