社区讨论
Dij80pts求调qwq
P3956[NOIP 2017 普及组] 棋盘参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @m2d80ddj
- 此快照首次捕获于
- 2024/10/17 19:31 去年
- 此快照最后确认于
- 2025/11/04 16:59 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[1005],b[1005],c[1005],gg,INF=1e16,dp[1005],vis[1005],ans,zd;
vector< pair<long long,long long> > vec[1005];
priority_queue< pair<long long,long long> > q;
inline void Dij(){
q.push({0,1});
while(!q.empty()){
long long f=q.top().second;
q.pop();
if(vis[f]) continue;
vis[f]=1;
for(int i=0;i<vec[f].size();i++){
long long w=vec[f][i].first,to=vec[f][i].second;
if(dp[f]+w<dp[to]){
dp[to]=dp[f]+w;
q.push({-w,to});
}
}
}
}
inline void write(long long x){
if(x==INF) cout<<-1;
else cout<<x;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
if(a[i]==1&&b[i]==1) gg=i;
if(a[i]==m&&b[i]==m) zd=i;
}
for(int i=1;i<=1002;i++) dp[i]=INF;
dp[gg]=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(a[i]==a[j]&&abs(b[i]-b[j])<=1){
vec[i].push_back({abs(c[i]-c[j]),j});
vec[j].push_back({abs(c[i]-c[j]),i});
}
else if(b[i]==b[j]&&abs(a[i]-a[j])<=1){
vec[i].push_back({abs(c[i]-c[j]),j});
vec[j].push_back({abs(c[i]-c[j]),i});
}
else if(abs(a[i]-a[j])+abs(b[i]-b[j])==2){
vec[i].push_back({abs(c[i]-c[j])+2,j});
vec[j].push_back({abs(c[i]-c[j])+2,i});
}
}
}
Dij();
ans=INF;
if(zd!=0) write(dp[zd]);
else{
for(int i=1;i<=n;i++){
if((a[i]==m&&b[i]==m-1)||(a[i]==m-1&&b[i]==m)){
ans=min(ans,dp[i]+2);
}
}
write(ans);
}
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...