0分kruskal求助
查看原帖
0分kruskal求助
342868
qfpjm楼主2021/8/6 10:16

调了半天,只过了样例、

#include <bits/stdc++.h>

using namespace std;

struct dian
{
	int x, y;
}d[1000005];

struct edge
{
	int u, v;
	double w;
}e[1000005];

int n, m, cnt, parent[1000005], ei;
double ans;

double juli(int x, int y) 
{
	return (double)(sqrt((double)(d[x].x - d[y].x) * (d[x].x - d[y].x) + (double)(d[x].y - d[y].y) * (d[x].y - d[y].y)));
}

int find(int v1)
{
	while (v1 != parent[v1])
	{
		v1 = parent[v1];
	}
	return v1;
}

void _union(int v1, int v2)
{
	int p1 = find(v1);
	int p2 = find(v2);
	if (p1 != p2)
	{
		parent[p1] = p2;
	}
}

bool isSame(int v1, int v2)
{
	if (find(v1) == find(v2))
	{
		return true;
	}
	return false;
}

int cmp(edge a, edge b)
{
	return a.w < b.w;
}

void Kruskal()
{
	for (int i = 1 ; i <= ei ; i ++)
	{
		if (isSame(e[i].u, e[i].v))
		{
			continue;
		}
		ans += e[i].w;
		cout << e[i].w;
		_union(e[i].u, e[i].v);
		cnt ++;
		if (cnt == n)
		{
			break;
		}
	}
}

int main()
{
	cin >> n >> m;
	for (int i = 1 ; i <= n ; i ++)
	{
		parent[i] = i;
		cin >> d[i].x >> d[i].y;
	}
	for (int i = 1 ; i <= n ; i ++)
	{
		for (int j = i + 1 ; j <= n ; j ++)
		{
			e[++ ei].u = i;
			e[ei].v = j;
			e[ei].w = juli(i, j);
		}
	}
	for (int i = 1 ; i <= m ; i ++)
	{
		int x, y;
		cin >> x >> y;
		e[++ ei].u = x;
		e[ei].v = y;
		e[ei].w = 0.0;
	}
	sort(e + 1, e + 1 + ei, cmp);
	Kruskal();
	cout << fixed << setprecision(2) << ans;
	return 0;
}
2021/8/6 10:16
加载中...