1342:【例4-1】最短路径问题

【题目描述】
平面上有n个点(n≤100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。

若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。

【输入】
共n+m+3行,其中:

第一行为整数n。

第2行到第n+1行(共n行) ,每行两个整数x和y,描述了一个点的坐标。

第n+2行为一个整数m,表示图中连线的个数。

此后的m 行,每行描述一条连线,由两个整数i和j组成,表示第i个点和第j个点之间有连线。

最后一行:两个整数s和t,分别表示源点和目标点。

【输出】
一行,一个实数(保留两位小数),表示从s到t的最短路径长度。

【输入样例】
5
0 0

2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5
【输出样例】
3.41
【来源】

No
比较裸的dijkstra的题目,比较要注意的就时要把点之间的距离记录在路径中,我立马想到的时结构体,但还有一种时用一个二维数组a[][2],a[i][0],记录第几个点的x,a[i][1],记录第几个点的y,还有一点在重置距离为INF时,最好用fill,memset最好不用(除非0,-1)这和这两个函数的存储方式有关,memset要127或者0x3f3f3f3
0x3f3f3f3f
区别

#include
#include
#include
#include
#include
using namespace std;
int a[105][2];
double dis[105];
double mapp[105][105];
bool vis[105]={false};
int n;
double cal(int x1,int y1,int x2,int y2){
	return sqrt( double((x1-x2)*(x1-x2))+ double((y1-y2)*(y1-y2)) );
}
void dijkstra(int st){
	for(int i=1;i<=n;i++) dis[i]=mapp[st][i];
	dis[st]=0;
	vis[st] = true;
	for(int i=1;i<=n;i++){
		int u=-1;
		int min=1000000000;
		for(int j=1;j<=n;j++){
			if(!vis[j] && dis[j] < min){
				u=j;
				min=dis[j];
			}
		}
		if(u ==-1) return;
		vis[u]=true;
		for(int j=1;j<=n;j++){
			if(!vis[j] && dis[u] +mapp[u][j] >n;
    for(int i=1;i<=n;i++){
    	cin>>w>>z;
    	a[i][0]=w;
    	a[i][1]=z;
	}
	cin>>m;
	int x,y;
	while(m--){
		cin>>x>>y;
		mapp[x][y]=mapp[y][x]=cal(a[x][0],a[x][1],a[y][0],a[y][1]);
	}
	cin>>st>>ed;
	//cout<

参考1
参考2
当然dijkstra还有更优化的模板,是用小根堆实现,原理都差不多,这几天再弄熟练,

你可能感兴趣的:(图)