pku1751.cpp

来自「这是ACM 方面的资料 是PKU的 北京大学的出来的」· C++ 代码 · 共 85 行

CPP
85
字号
#include <stdio.h>
#define SZ 800
#define TheMax 100000001

typedef struct 
{
	int dis;
	int id;
	int st;
} DDD;


DDD mindis[SZ];
int x[800], y[800];
int Dis[SZ][SZ];
int N, K;

void pre()
{
	int i, j;
	for (i = 1; i <= N ; i++)
	{
		for (j = 1; j < i; j++)
		{
			Dis[i][j] = Dis[j][i] = (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]);
		}
		Dis[i][i] = 0;
	}
}

void Prim()
{
	int i, j, u, min;

	for (i = 2; i <= N; i++)
	{
		mindis[i].dis = Dis[i][1];
		mindis[i].id = 1;
		mindis[i].st = 0;
	}
	mindis[1].st = 1;
	
	for (i = 1; i < N; i++)
	{
		min = TheMax;
		u = -1;
		for (j = 1; j <= N; j++)
		{
			if (!mindis[j].st && mindis[j].dis < min)
			{
				min = mindis[j].dis;
				u = j;
			}
		}
		mindis[u].st = 1;
		if (min) printf("%d %d\n", u, mindis[u].id);
		for (j = 1; j <= N; j++)
		{
			if (!mindis[j].st && mindis[j].dis > Dis[u][j])
			{
				mindis[j].dis = Dis[u][j];
				mindis[j].id = u;
			}
		}
	}
}

int main()
{
	int i, j, s, e;
	scanf("%d", &N);
	for (i = 1; i <= N; i++)
	{
		scanf("%d%d", x + i, y + i);
	}
	pre();
	scanf("%d", &K);
	for (i = 0; i < K; i++)
	{
		scanf("%d %d", &s, &e);
		Dis[s][e] = Dis[e][s] = 0;
	}
	Prim();
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?