4152. [AMPPZ2014]The Captain(稠密图最短路)
生活随笔
收集整理的這篇文章主要介紹了
4152. [AMPPZ2014]The Captain(稠密图最短路)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
4152. [AMPPZ2014]The Captain
顯然稠密圖的邊數時n2n^2n2量級,我們不可能把所有邊建立出來,這時候通常尋求一些性質詳細見【論題選編】稠密圖最短路
針對本題我們可以先這樣考慮,假設每個點有且只有一維信息,那么任意兩點之間的距離可以寫為∣xi?xj∣|x_i-x_j|∣xi??xj?∣
首先我們對xxx進行排序,并且考慮相鄰的三個點i,j,ki,j,ki,j,k,顯然我們只需要在i,ji,ji,j以及j,kj,kj,k之間連邊對于i→ki\to ki→k這條邊沒有必要去連。
稍微思考一下二維同樣也是如此,詳細也可以看上述博客博主解釋
#include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std; using pii=pair<int,int>; using ll=long long; constexpr int N=200010,M=800010; int h[N],e[M],ne[M],w[M],idx; void add(int a,int b,int c){e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;} int n; struct node {int x,y,id; }q[N]; ll d[N]; bool st[N]; void dijkstra() {priority_queue<pii,vector<pii>,greater<pii>> q;memset(d,0x3f,sizeof d);memset(st,0,sizeof st);d[1]=0;q.push({0,1});while(q.size()){int u=q.top().second;q.pop();if(st[u]) continue;st[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(d[v]>d[u]+w[i]){d[v]=d[u]+w[i];q.push({d[v],v});}}} } int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n;memset(h,-1,sizeof h);for(int i=1;i<=n;i++) {int x,y;cin>>x>>y;q[i]={x,y,i};}sort(q+1,q+1+n,[](const node &a,const node&b){return a.x<b.x;});for(int i=1;i<n;i++) {int u=q[i].id,v=q[i+1].id,c=q[i+1].x-q[i].x;add(u,v,c),add(v,u,c);}sort(q+1,q+1+n,[](const node &a,const node&b){return a.y<b.y;});for(int i=1;i<n;i++) {int u=q[i].id,v=q[i+1].id,c=q[i+1].y-q[i].y;add(u,v,c),add(v,u,c);}dijkstra();cout<<d[n]<<'\n';return 0; }總結
以上是生活随笔為你收集整理的4152. [AMPPZ2014]The Captain(稠密图最短路)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nobody什么意思 nobody解释
- 下一篇: P2685 [TJOI2012]桥(最短