牛客國慶集訓派對Day1 L題
阿新 • • 發佈:2019-02-17
今天在牛客網上過國慶節的時候發現一個有點意思的最短路問題,連結在上面,程式碼在下面:
#include<bits/stdc++.h> using namespace std; int a,b,c1,c2; const int INF =1e8; struct node{ int x,y,r; }cir[1005]; int book[1005]; double distance1(node A,node B){ double dis=sqrt(pow(A.x-B.x,2)+pow(A.y-B.y,2)); return max(dis-A.r-B.r,0.0); } double distance2(node A,int c){ double dis=abs(a*A.x+b*A.y+c)/sqrt(pow(a,2)+pow(b,2)); return max(dis-A.r,0.0); } double dis[1005]; int main() { int n; cin>>n>>a>>b>>c1>>c2; memset(dis,1e5,sizeof(dis)); memset(book,0,sizeof(book)); for(int i=0;i<n;i++){ scanf("%d%d%d",&cir[i].x,&cir[i].y,&cir[i].r); } for(int i=0;i<n;i++){ dis[i]=distance2(cir[i],c1); } dis[n]=abs(c1-c2)/sqrt(pow(a,2)+pow(b,2)); int u; for (int i=1;i<=n;i++){ int min=INF; for (int j=0;j<n;j++){ if (book[j]==0 && dis[j]<min){ //找出未確定最短路徑的距離源點最近的點 min=dis[j]; u=j; } } book[u]=1; //標記u點 說明到u點的最短路徑已經確定 for (int v=0;v<n;v++){ if (dis[v]>dis[u]+distance1(cir[u],cir[v])) dis[v]=dis[u]+distance1(cir[u],cir[v]); } if(dis[n]>dis[u]+distance2(cir[u],c2)) dis[n]=dis[u]+distance2(cir[u],c2); } printf("%.6lf",dis[n]); }