社区讨论
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 条回复,欢迎继续交流。
正在加载回复...