好久没写最小算法了,复习一下。
首先是kruskal
由于两个节点间距离的取值只可能是1-7(每个点的名字不同),所以 不用排序,直接放到对应的数组里面就行了。
然后直接交上去TLE,加了个优化当已经达到n-1条边时直接goto end
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define MAXN 2000
#define MAXM 8
using namespace std;
int n;
char truck[MAXN][MAXM];
int dis[8][MAXN*MAXN][2],discount[8],fa[MAXN];
int dist(char*p,char*q){
int ret=0;
for(int i=0;i<7;i++)
if(p[i]!=q[i])
ret++;
return ret;
}
int find(int a){
int b=a,c;
while(b!=fa[b])b=fa[b];
while(a!=b)c=fa[a],a=b,a=c;
return b;
}
int un(int a,int b){
fa[b]=fa[a];
}
void init(){
getchar();
for(int i=1;i<=n;i++)
gets(truck[i]);
memset(discount,0,sizeof(discount));
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
int d=dist(truck[i],truck[j]);
dis[d][discount[d]][0]=i,dis[d][discount[d]++][1]=j;
}
}
for(int i=1;i<=n;i++)
fa[i]=i;
}
void solve_kruskal(){
int ans=0,t=0;
for(int i=0;i<=7;i++){
for(int j=0;j<discount[i];j++){
int a=dis[i][j][0],b=dis[i][j][1];
int aa=find(a),bb=find(b);
if(aa==bb)
continue;
else{
un(aa,bb);
ans+=i;
t++;
if(t==n-1)
goto end;
}
}
}
end:
printf("The highest possible quality is 1/%d.\n",ans);
}
int main(){
while(cin>>n&&n){
init();
solve_kruskal();
}
return 0;
}
然后是prim,据说prim可以优化到(V+E)lgv ,这里只实现了平方复杂度。但是这里的平方复杂度还是比kruskal快
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define MAXN 2010
#define MAXM 9
using namespace std;
int n;
char truck[MAXN][MAXM];
int dis[MAXN],vis[MAXN],H;
int dist(char* p,char*q){
int ret=0;
for(int i=0;i<7;i++){
if(p[i]!=q[i])
ret++;
}
return ret;
}
void init(){
getchar();
for(int i=1;i<=n;i++)
gets(truck[i]);
dis[1]=0;
for(int i=2;i<=n;i++)
dis[i]=0x7f7f7f7f;
memset(vis,0,sizeof(vis));
vis[1]=1;
}
void solve_prim(){
int ans=0,last=1,which,minn;
for(int i=1;i<=n;i++){
minn=0x7f7f7f7f;
ans+=dis[last];
for(int j=1;j<=n;j++){
if(!vis[j]){
int d=dist(truck[last],truck[j]);
dis[j]=min(dis[j],d);
if(dis[j]<minn){
minn=dis[j],which=j;
}
}
}
last=which;
vis[last]=1;
}
printf("The highest possible quality is 1/%d.\n",ans);
}
int main(){
while(cin>>n&&n){
init();
solve_prim();
}
}