这是《编程挑战》的一道例题,证明网上大神很多都做了,我就简单说一下易错点吧。
第一点,这个人是从0开始查的,所以并查集初始化别忘了0.
第二点,这道题的克鲁斯卡尔要把所有的边都遍历一遍。因为这个图不一定是连通图,所以G(V,E)最后的边数可不一定是V-1,而遍历所有的边就能克服这个矛盾。
第三点,对于每次对a和b是否在同一个集合的查询,一定要再做一次gf(a),gf(b),这样才能保证如果a,b在同一个集合,f[a]==f[b],否则可能不等。
下面上代码。
15513776 | XXX | 3723 | Accepted | 840K | 469MS | C++ | 1001B |
#include
#include
using namespace std;
int n,m,r,t;
struct node
{
int a,b,cost;
} e[51000];
int f[21000];
int gf(int x)
{
if(f[x]==x) return x;
else
{
f[x]=gf(f[x]);
return f[x];
}
}
void un(int x,int y)
{
int fx=gf(x),fy=gf(y);
if(fx==fy) return ;
else f[fx]=fy;
}
void init()
{
scanf("%d %d %d",&n,&m,&r);
int a,b,cost;
for(int i=0;i
祝大家学习愉快,愿OI永葆青春