社区讨论

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 条回复,欢迎继续交流。

正在加载回复...