我看书上的代码,觉得这一行有错误,
//这里为什么要加上女生的人数而不是男生的人数?我认为应该加男生的人数
es[j].v = v+N;
所以我就没这样写,我写的是
es[j].v = v+M;
在codeblocks运行的好好的,来了poj一直报错,debug两个多小时,终于发现,书里的题目和poj上的题目,x,y表示的正好相反啊啊啊啊啊啊啊!!!!!!!!!
书里说,(x,y,d)表示的是第x号男兵和第y号女兵的亲密度是d
poj的原题说的是第x号女兵和第y号男兵的亲密度是d!!!
好了 容我歇会儿
附上AC的源码
#include <cstdio>
#include <algorithm>
#define MAX 10000
using namespace std;
int par[MAX*2];
int height[MAX*2];
int N,M,R;
void init_union_find(int v)
{
for(int i=0;i<v;i++)
{
par[i]=i;
}
fill(height,height+v,0);
}
int find_root(int x)
{
if(par[x]==x)
{
return x;
}
return find_root(par[x]);
}
void unite(int x,int y)
{
x = find_root(x);
y = find_root(y);
if(x==y)
{
return;
}
if(height[x]>height[y])
{
par[y]=x;
}
else
{
par[x]=y;
if(height[x]==height[y])
{
height[y]++;
}
}
}
bool same(int x,int y)
{
return find_root(x)==find_root(y);
}
struct edge {
int u,v,cost;
};
bool comp(const edge& e1,const edge& e2)
{
return e1.cost<e2.cost;
}
edge es[MAX*5];
int kruskal()
{
sort(es,es+R,comp);
init_union_find(N+M);
int res = 0;
for(int i=0;i<R;i++)
{
edge e = es[i];
//printf("edge e :%d %d %d",es[i].u,es[i].v,es[i].cost);
if(!same(e.u,e.v))
{
unite(e.u,e.v);
res += e.cost;
}
}
return res;
}
int main()
{
int loop;
scanf("%d",&loop);
int u,v,cost;
for(int i=0;i<loop;i++)
{
scanf("%d%d%d",&N,&M,&R);
for(int j=0;j<R;j++)
{
scanf("%d%d%d",&u,&v,&cost);
es[j].cost = -cost;
es[j].u = u;
//这里为什么要加上女生的人数而不是男生的人数?我认为应该加男生的人数
es[j].v = v+N;
}
printf("%d\n",(N+M)*MAX+kruskal());
}
return 0;
}
AC万岁,过啥圣诞,要啥自行车。