poj 2253(dijkstra)

题目的意思很明白, 就是每次都找最近的一点, 有点类似于prim算法, 是dijkstra的一个小变形, 就是最后输出的时候不知道为什么要用%f
而不能用%lf,因为这个地方想了好久,郁闷。。

#include <cmath>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>

using namespace std;

typedef pair<int, int> PII;

const int N = 1010;

struct E
{
	int x, y;
}edgs[N];

int n, starx, stary, endx, endy;

double bis[N][N], res;

bool vis[N][N];

double check(int a, int b, int c, int d)
{
	double n = (a - c), m = (b - d);

	return sqrt(n * n + m * m);
}


void dijkstra()
{
    memset(vis, 0, sizeof vis);
	memset(bis, 127, sizeof bis);
	bis[starx][stary] = 0;
	

	for (int i = 1; i <= n; i ++)
	{
		int t = -1;
		for (int j = 0; j < n; j ++)
		{
			if (!vis[edgs[j].x][edgs[j].y] && (t == -1 || bis[edgs[j].x][edgs[j].y] < bis[edgs[t].x][edgs[t].y])) t = j;
		}
	
		int a = edgs[t].x, b = edgs[t].y;

		res = max(bis[a][b], res);

		if (t == 1) break;

		vis[a][b] = true;

		for (int j = 0; j < n; j ++)
		{
			bis[edgs[j].x][edgs[j].y] = min(bis[edgs[j].x][edgs[j].y],check(a, b, edgs[j].x, edgs[j].y));
			//cout << bis[edgs[j].x][edgs[j].y] << endl;
		}
	}
	
	return;
}

int main()
{
	int t = 1;
	while (cin >> n && n)
	{
		res = 0;
		memset(edgs, 0, sizeof edgs);
		cin >> starx >> stary >> endx >> endy;
		edgs[0] = { starx, stary }, edgs[1] = { endx, endy };
		for (int i = 2; i < n; i++)
		{
			int a, b; scanf("%d %d", &a, &b);
			edgs[i] = { a, b };
		}
		dijkstra();

		printf("Scenario #%d\nFrog Distance = %.3f\n\n", t++, res);
	}
	return 0;
}
发布了53 篇原创文章 · 获赞 14 · 访问量 1908

猜你喜欢

转载自blog.csdn.net/weixin_45630535/article/details/104698141