题目链接:http://poj.org/problem?id=1751
大意是一个有n个城市的国家,已知有些城市有道路联通,问增加哪些道路使得所有的城市都可以彼此联通且代价最小,已经代价是两个城市坐标的笛卡尔距离;
就是一个纯粹的找最小生成树的题;
首先讲所有边按权值从小到大排序,然后依次取最小边,如果联通的两个节点在两个联通分量上,则加入这条边,否则删除这条边;
kruskal算法的要点就是判断两个节点是不是在一个联通分量上,于是够着个标记数组flag[];开始时候令flag[i]=i;这样就所有的节点都是一个联通分量,然后在取已有的m条边时,
设边链接的节点为u,v,则令f[u]=f[v];就行了,这样两个节点就在一个联通分量上了,不过操作的时候不是f[u]=f[v]这么简单,因为必须使u在的联通分量和v在的联通分量联通起来,所以每个联通分量里的节点的flag值可以指向同一个节点,具体的操作见下面代码:
此题输出边的时候没有要求顺序;
参考代码如下:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
const int MAX_SIZE=800;
struct Node
{
int u,v;
double w;
bool operator < (const Node a)const
{
return w<a.w;
};
}edge[MAX_SIZE*MAX_SIZE/2];
struct point
{
int