社区讨论
60pts求调
P3831[SHOI2012] 回家的路参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mk0sg01p
- 此快照首次捕获于
- 2026/01/05 14:37 上个月
- 此快照最后确认于
- 2026/01/05 14:44 上个月
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
constexpr int N=20005,M=100005;
int n,m;
struct sta{
int x,y,id;
}ss[M];
bool cmp1(const sta& a,const sta& b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
bool cmp2(const sta& a,const sta& b){
if(a.y==b.y)return a.x<b.x;
return a.y<b.y;
}
int id(int u,int c){
return u+c*m;
}
struct edge{
int v,w;
bool operator<(const edge& b)const{
return w>b.w;
}
};
vector<edge> g[M*2];
int dis[N*2];
bool vis[N*2];
void dij(int n,int s){
memset(dis,0x3f,sizeof(dis));
priority_queue<edge> q;
q.push({s,0});
while(!q.empty()){
auto [u,d]=q.top();q.pop();
if(vis[u])continue;
vis[u]=1;
for(auto [v,w]:g[u]){
if(d+w<dis[v]){
dis[v]=d+w;
q.push({v,dis[v]});
}
}
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>ss[i].x>>ss[i].y;ss[i].id=i;
g[i].push_back({i+m+2,1});
g[i+m+2].push_back({i,1});
}
cin>>ss[m+1].x>>ss[m+1].y;g[m+1].push_back({2*m+3,0});g[2*m+3].push_back({m+1,0});ss[m+1].id=m+1;
cin>>ss[m+2].x>>ss[m+2].y;g[m+2].push_back({2*m+4,0});g[2*m+4].push_back({m+2,0});ss[m+2].id=m+2;
m+=2;
sort(ss+1,ss+m+1,cmp1);
for(int i=1;i<m;i++){
if(ss[i].x==ss[i+1].x){
g[ss[i].id].push_back({ss[i+1].id,2*(ss[i+1].y-ss[i].y)});
g[ss[i+1].id].push_back({ss[i].id,2*(ss[i+1].y-ss[i].y)});
}
}
/*for(int i=1;i<=m;i++){
cout<<ss[i].id<<" "<<ss[i].x<<" "<<ss[i].y<<"\n";
}*/
sort(ss+1,ss+m+1,cmp2);
for(int i=1;i<m;i++){
if(ss[i].y==ss[i+1].y){
g[ss[i].id+m].push_back({ss[i+1].id+m,2*(ss[i+1].x-ss[i].x)});
g[ss[i+1].id+m].push_back({ss[i].id+m,2*(ss[i+1].x-ss[i].x)});
}
}
/*for(int i=1;i<=m;i++){
cout<<ss[i].id<<" "<<ss[i].x<<" "<<ss[i].y<<"\n";
}*/
/*for(int i=1;i<=2*m;i++){
for(auto [v,w]:g[i]){
cout<<i<<" "<<v<<" "<<w<<"\n";
}
}*/
dij(m*2,m-1);
cout<<(dis[m]==0x3f3f3f3f3f3f3f3f?-1:dis[m]);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...