xynuoj 1594 最短路径问题

给你几个点,以及点和点之间是否链接,求出起点到终点的距离。

注意距离是浮点数。。。

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 150//只有100个点,数大了会错。。。
int n,m;

double map[MAXN][MAXN];
struct Point{
	double x,y;
}point[MAXN];

double  dis(Point a,Point b){
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double dist[MAXN];
int vis[MAXN];
void dijkstra(int st){
	
	for(int i=1;i<=n;i++){
		dist[i]=map[st][i];
		vis[i]=0;
	}
	vis[st]=1;
	dist[st]=0.0;
	
	for(int i=1;i<n;i++){
		double minn=INF;
		int u=-1;
		for(int j=1;j<=n;j++){
			
			if(dist[j]<minn&&!vis[j]){
				u=j;
				minn=dist[j];
			}
			
		}
		if(u==-1)
		return ;
		vis[u]=1;
		
		for(int k=1;k<=n;k++){
			if(!vis[k]&&dist[k]>dist[u]+map[u][k])
			dist[k]=dist[u]+map[u][k];
		}
	}
	
	
}
int main(){
	
	while(scanf("%d",&n)!=EOF){
		
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		map[i][j]=(i==j?0:INF);
		
		for(int i=1;i<=n;i++){
			scanf("%lf%lf",&point[i].x,&point[i].y);
		}
		
		scanf("%d",&m);
		for(int i=0;i<m;i++){
			int st,ed;
			scanf("%d%d",&st,&ed);
			map[st][ed]=map[ed][st]=dis(point[st],point[ed]);
		}
		
//		for(int i=1;i<=n;i++){
//		for(int j=1;j<=n;j++)
//		printf("%lf  ",map[i][j]);	
//		puts("");
//		}
//	 
		int st,ed;
		scanf("%d%d",&st,&ed);
		
		dijkstra(st);
		printf("%.2lf\n",dist[ed]);
		
	}
	
	
	
	return 0;
}

阅读更多
想对作者说点什么?
相关热词

博主推荐

换一批

没有更多推荐了,返回首页