| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
TLE求救啊 各位大侠留步啊。。。。#include<iostream>
#include<algorithm>
struct relation //所谓"relationship"
{
int x,y,d;
};
struct set //查并集节点的类
{
set *root;
int rank;
set();
set* find();
void operator>>(set&);
};
set::set() //构造函数
{
root=this;
rank=0;
}
set* set::find() //查找根
{
set *p,*i,*j;
for(p=this;p->root!=p;p=p->root);
for(i=this;i!=p;i=j)
{
j=i->root;
i->root=p;
}
return p;
}
void set::operator>>(set &a) //合并
{
if(find()->rank==a.find()->rank)
{
find()->root=a.find();
a.find()->rank++;
}
else if(find()->rank>a.find()->rank)
{
a.find()->root=find();
}
else
{
find()->root=a.find();
}
return;
}
bool comp(relation &a,relation &b) //排序比较
{
return a.d>b.d;
}
int main()
{
int cases,N,M,R,i,total,rn; //rn用来标记已经使用的"关系"的个数
set *sets; //查并集节点数组,数量不定
relation *rs;
std::cin>>cases;
while(cases--)
{
//初始化
std::cin>>N>>M>>R;
sets=new set[N+M];
rs=new relation[R];
for(i=0;i<R;i++)
{
std::cin>>rs[i].y>>rs[i].x>>rs[i].d;
rs[i].x+=N;
}
std::sort(rs,rs+R,comp);//排序
//计算
total=10000*(M+N);
rn=0;
for(i=0;(rn<M+N)&&(i<R);i++)//或已使用足够数量的"关系"或没有"关系"可用
{
//根节点不同,合并起来,贪污掉俩人"关系"
if(sets[rs[i].x].find()!=sets[rs[i].y].find())
{
sets[rs[i].x]>>sets[rs[i].y];
total-=rs[i].d;
rn++;
}
}
//输出并为下一个case做准备
std::cout<<total<<std::endl;
delete sets;
delete rs;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator