怎么我的算法时间和空间都这么就,别人的kruskal还是比较快的! 去学习一下!
/*kruskal算法*/
#include <iostream>
//#include <fstream>
#include <algorithm>
using namespace std;
#define MAX 2001
#define min(a,b) (a-b<0?a:b)
/*45612K 1563MS*/
typedef struct _node
{
int x,y;
int weight;
}node;
int n;
char a[MAX][8];
int sum;
//fstream fin;
void kruskal(node *a,int index);
int GetDis(int x,int y);
int cmp(const void *a,const void *b);
int main()
{
//fin.open("1789.txt",ios::in);
while(cin>>n)
{
if(n==0) break;
sum=0;
for(int i=0;i<n;i++)
cin>>a[i];
//计算边的信息
node *a=new node[n*n];
node temp;
int index=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
temp.x=i;
temp.y=j;
temp.weight=GetDis(i,j);
a[index++]=temp;
}
kruskal(a,index);
cout<<"The highest possible quality is 1/"<<sum<<"."<<endl;
delete []a;
}
system("pause");
return 0;
}
int GetDis(int x,int y)
{
int count=0;
for(int i=0;i<7;i++)
if(a[x][i]!=a[y][i])
++count;
return count;
}
int cmp(const void *a,const void *b)
{
node a1=*(node *)a;
node b1=*(node *)b;
return (a1.weight-b1.weight);
}
void kruskal(node *a,int index)
{
//排序
qsort(a,index,sizeof(node),cmp);
int *s=new int[n];
memset(s,0,sizeof(int)*n);
int parts=0; //分支数
for(int i=0;i<index;i++)
{
if(a[i].weight==0) continue;
int u,v;
u=a[i].x;v=a[i].y;
//判断u,v在位置上
if(!s[u]&&!s[v])
{
parts++;
s[u]=parts;
s[v]=parts;
sum+=a[i].weight;
}
else if(s[u]&&!s[v])
{
s[v]=s[u];
sum+=a[i].weight;
}
else if(s[v]&&!s[u])
{
s[u]=s[v];
sum+=a[i].weight;
}
else
{
if(s[u]!=s[v]) //不在同一个分支上
{
//计算最小的分支
int min=s[u];
int max=s[v];
if(s[v]>s[u])
{
min=s[v];
max=s[u];
}
for(int j=0;j<n;j++)
{
if(s[j]==max)
s[j]=min;
if(s[j]>max)
s[j]--;
}
parts--;
sum+=a[i].weight;
}
}
}
delete []s;
}