prim, 0pts, 大佬求调
查看原帖
prim, 0pts, 大佬求调
636358
WindyDay楼主2023/3/5 21:44

#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;

const int N = 1005;
const double inf = 1e9;

struct point
{
	double x, y;
};

double pdis[N][N];
point p[N];
bool vis[N];
int n, m;
double dis[N];

double getdis(point a, point b)
{
	return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

double prim(int st)
{
	memset(dis, 0x3f, sizeof(dis));
	dis[st] = 0;
	double sum = 0;
	for(int i = 1; i <= n; i++)
	{
		int k = 0;
		for(int j = 1; j <= n; j++)
		{
			if(!vis[j] && dis[j] < dis[k])
			{
				k = j;
			}
		}
		
		if(k == 0) return 0;
		
		vis[k] = 1;
		sum += dis[k];
		
		for(int j = 1; j <= n; j++)
		{
			int v = j;
			double w = pdis[k][j];
			if(!vis[v] && w < dis[v])
			{
				dis[v] = w;
			}
		}
	}
	
	return sum;
}

void Input()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
	{
		int x, y;
		cin >> x >> y;
		p[i].x = x;
		p[i].y = y;
	}
	
	for(int i = 1; i <= n; i++)
	{
		for(int j = i; j <= n; j++)
		{
			if(j == i) pdis[i][j] = 0;
			else
			{
				double d = getdis(p[i], p[j]);
				pdis[i][j] = d;
				pdis[j][i] = d;
				cout << pdis[i][j] << " ";
			}
		}
		cout << endl;
	}
	
	for(int i = 1; i <= m; i++)
	{
		int u, v;
		cin >> u >> v;
		pdis[u][v] = 0.00;
	}
}

int main()
{
	Input();
	printf("%.2lf", prim(1));
	return 0;
}


2023/3/5 21:44
加载中...