日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 4885 (n^2*log(n)推断三点共线建图)+最短路

發(fā)布時間:2024/4/17 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 4885 (n^2*log(n)推断三点共线建图)+最短路 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意:車從起點出發(fā),每次僅僅能行駛L長度,必需加油到滿,每次僅僅能去加油站或目的地方向,路過加油站就必需進去加油,問最小要路過幾次加油站。

開始時候直接建圖,在范圍內(nèi)就有邊1.跑最短了,再讀題后發(fā)現(xiàn),若幾個點共線,且都在范圍內(nèi),那么中間有點的倆頭的點就不能有邊,否則與條件相悖。關鍵是怎么用n^2*logn,的復雜度推斷三點共線:點先按X排序,考察每一個點i時候,第二個點j,若直線ij斜率已經(jīng)存在,則不能加入了,查找是否存在,用容器即可(map\set)都是logn的,所以滿足要求。之后最短路即可。

#include<iostream> #include<cstring> #include<queue> #include<cstdio> #include<algorithm> #include<map> using namespace std; const int inf=0x3f3f3f3f; struct points {long long x,y; }; long long inline getdis(points a,points b) {return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } bool my(points a,points b) {if(a.x!=b.x)return a.x<b.x;else return a.y<b.y; } int n;long long l; points po[1005]; int dis[1005][1008]; int d[1005];int inq[1005]; int ans=0;points s,t;int nums,numt; double inline getk(points a,points b) //獲得斜率 {if(b.x==a.x)return inf;return (a.y-b.y)*1.0/(a.x-b.x); } void spfa() {for(int i=0;i<n+2;i++){d[i]=inf;inq[i]=0;}queue<int>q;inq[nums]=1;d[nums]=0;q.push(nums);while(!q.empty()){int cur=q.front();q.pop();inq[cur]=0;for(int i=0;i<n+2;i++){if(d[i]>dis[cur][i]+d[cur]){d[i]=dis[cur][i]+d[cur];if(!inq[i]){q.push(i);inq[i]=1;}}}}return ; } int main() {int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&l);scanf("%d%d",&po[0].x,&po[0].y);scanf("%d%d",&po[n+1].x,&po[n+1].y);s.x=po[0].x; s.y=po[0].y;t.x=po[n+1].x; t.y=po[n+1].y;for(int i=1;i<=n;i++)scanf("%d%d",&po[i].x,&po[i].y);sort(po,po+n+2,my);for(int i=0;i<=n+1;i++) //起點,終點{if(po[i].x==s.x&&po[i].y==s.y)nums=i;if(po[i].x==t.x&&po[i].y==t.y)numt=i;}for(int i=0;i<=n+1;i++){map<double,int>ma;for(int j=i+1;j<=n+1;j++){if(getdis(po[i],po[j])<=l*l) //在距離范圍內(nèi)的再查找。{double tempk=getk(po[i],po[j]);if(ma.find(tempk)!=ma.end()){dis[j][i]=dis[i][j]=inf;}else{dis[j][i]=dis[i][j]=1;ma[tempk]=1;}}elsedis[j][i]=dis[i][j]=inf;}}spfa();if(d[numt]==inf)printf("impossible\n");elseprintf("%d\n",d[numt]-1);}return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/zfyouxi/p/4294170.html

總結(jié)

以上是生活随笔為你收集整理的hdu 4885 (n^2*log(n)推断三点共线建图)+最短路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。