POJ2502(最短路径dijkstra)

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std; 
struct node{  
    int x,y;  
}q[211];  
double a[211][211],d[211],jl;  
int p[211];  
double lj(int x1,int y1,int x2,int y2){  
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));  
}
int main(){
	int i,j,k,m,n;
	int x,y,z;
	int sx,sy,fx,fy;
	cin>>sx>>sy>>fx>>fy;
	q[1].x=sx;
	q[1].y=sy;
	n=1;
	int pd=0;
	int asd=0;
	while(1){  
	    cin>>x>>y;
        if(x==-1 && y==-1){
		  if(asd==0){pd=0;asd=1;continue;}
		  else break;
		}  
        q[++n].x=x;q[n].y=y;  
        if(pd==1){  
            a[n][n-1]=lj(q[n-1].x,q[n-1].y,q[n].x,q[n].y)*60.0/40000.0;              
            a[n-1][n]=a[n][n-1];  
        }  
        pd=1;  
        asd=0;
    }
    q[++n].x=fx;
    q[n].y=fy;
    for(i=1;i<=n;i++)  
        for(j=1;j<=n;j++){  
            jl=lj(q[i].x,q[i].y,q[j].x,q[j].y)*60.0/10000.0;  
            if(a[i][j]==0)  
                a[i][j]=jl;  
            else 
			  if(jl<a[i][j])a[i][j]=jl;
        }  
    for(i=1;i<=n;i++)d[i]=100000000.0;
    d[1]=0;  
    double minn;
    for(i=1;i<=n;i++){ 
        minn=1000000000.0;
        for(j=1;j<=n;j++)
          	if(!p[j] && d[j]<minn){  
         	    k=j;  
          	    minn=d[j];  
          	}  
    p[k]=1;    
	for(j=1;j<=n;j++)  
        if(!p[j] && a[i][j]!=0 && d[j]>(a[j][k]+d[k]))  
            d[j]=a[j][k]+d[k];  
	}
	int ans=(int)(d[n]+0.5);  
    cout<<ans<<endl;
	return 0;
}

你可能感兴趣的:(算法,C语言,最短路径,图论,dijkstra)