| ||||||||||
| 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 | |||||||||
麻烦各位同学帮忙(kruskal,MLE) 谢谢自己用并查集写的kruskal算法,但总是出现MLE,由于是自己第一次出现这种错误,还请各位同学帮忙看看代码,鄙人认为自己的空间开辟主要是四个数组,但通过计算发现应该不会超过题目的限制,在这个问题上自己肯定有没有注意到的问题,麻烦大家帮忙看看,谢了!
#include <cstdlib>
#include <iostream>
#define maxvernum 100
#include <algorithm>
using namespace std;
struct ArcNode{
short l;
short r;
int weight;
};
short p[maxvernum],rank[maxvernum];//开辟数组空间1
inline void MakeSet (short i){
p[i]=i;
rank[i]=0;
}
inline short findSet (short x){
if (p[x]!=x)
p[x]=findSet (p[x]);
return p[x];
}
inline void linkSet (short x,short y){
if (rank[x]>rank[y])
p[y]=x;
else{
p[x]=y;
if (rank[x]=rank[y])
rank[y]++;
}
}
inline void unionSet (short x,short y){
linkSet (findSet(x),findSet(y));
}
bool cmp (ArcNode a,ArcNode b){
return a.weight<b.weight;
}
int kruskal (int n,short vernum,ArcNode arrArc[]){
int k=0,min=0;
sort (arrArc,arrArc+n,cmp);
for (int i=0; i<n; i++){
if (findSet (arrArc[i].l)!=findSet (arrArc[i].r)){
min+=arrArc[i].weight;
k++;
unionSet (arrArc[i].l,arrArc[i].r);
if (k==vernum-1) break;
}
}
return min;
}
int main(int argc, char *argv[])
{
int vernum;
while (scanf ("%d",&vernum))
{
short *arrVer=new short[vernum];//数组三空间
for (int i=0;i<vernum;i++)
MakeSet (i);
int edgnum=(vernum*(vernum-1))>>1;
ArcNode *arrArc=new ArcNode[edgnum];//数组四空间
int dis,k=0;
for (int i=0;i<vernum;i++)
for (int j=0;j<vernum;j++)
{
cin>>dis;
if (j>i&&i<vernum)
{
arrArc[k].weight=dis;
arrArc[k].l=i;
arrArc[k].r=j;
k++;
}
}
cout<<kruskal (edgnum,vernum,arrArc)<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator