There maybe a boy who loves ACM and breaking dance
阿新 • • 發佈:2018-12-22
這是我第一個dijkstra,之前接觸過,但不知道這個演算法,現在一看,還是不難的,關鍵就是不斷更新d[]陣列,使d[]數組裡面放的一直是
所有點到起點的最小值,還有vis[]陣列來避免重複查詢!!!!!!!!!!
#include<iostream> using namespace std; #include<algorithm> #include<math.h> struct node { double x; double y; }a[205]; int vis[205]; double d[205]; double map[205][205]; int main() { while(cin>>a[0].x>>a[0].y>>a[1].x>>a[1].y) { memset(map,0.0,sizeof(map)); int n=2; int sign=0; while(scanf("%lf%lf",&a[n].x,&a[n].y)!=EOF) { if(a[n].x==-1&&a[n].y==-1) { sign=0; //這個sign很有用,我已開始把輸入方式看錯了,一行的第一站和上一行的最後一站不是聯通的 continue; } if(sign==1) map[n][n-1]=map[n-1][n]=(sqrt((a[n].x-a[n-1].x)*(a[n].x-a[n-1].x)+(a[n].y-a[n-1].y)*(a[n].y-a[n-1].y)))/40000.0 ; n++; sign=1; } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(map[i][j]==0) { map[i][j]=map[j][i]=(sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)))/10000.0; if(i==j) map[i][j]=10000000.0; } } }//以下就是dijkstra的過程了 memset(vis,0,sizeof(vis)); vis[0]=1; for(int i=0;i<n;i++) d[i]=map[0][i]; // for(int i=0;i<n;i++) // cout<<d[i]<<' '; // system("pause"); double max=10000000.0; for(int i=1;i<n;i++) { double temp=max; int u; for(int j=1;j<n;j++) if(!vis[j]&&d[j]<temp) { temp=d[j]; u=j; } vis[u]=1; for(int j=0;j<n;j++) { if(!vis[j]) if(d[j]>map[u][j]+d[u]) d[j]=map[u][j]+d[u]; } } double ans=60.0*d[1]; printf("%0.lf\n",ans); } return 0; }