Truck History poj1789

来源:互联网 发布:java httputils 编辑:程序博客网 时间:2024/05/16 18:31

   题目不难,就是求一个最小生成树,没什么好说的。因为很久没写并查集了,所以写了个Kruskal的代码,就当练笔吧委屈

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;struct edge{int u,v,w;bool operator<(const edge &t)const{return w<t.w;}}p[2000000];char truck[2005][8];int set[2005],rank[2005];int n;int dist(int i,int j){int ans=0;for(int k=0;k<7;k++)if(truck[i][k]!=truck[j][k])ans++;return ans;}int find(int x){int i,j,r;r=x;while(set[r]!=r)r=set[r];i=x;while(set[i]!=r){j=set[i];set[i]=r;i=j;}return r;}bool merge(int x,int y){x=find(x);y=find(y);if(x==y)return false;if(rank[x]<rank[y])set[x]=y;else{set[y]=x;if(rank[x]==rank[y])rank[x]++;}return true;}int main(){int i,j,k;int sum;while(scanf("%d",&n),n){for(i=1;i<=n;i++)scanf("%s",truck[i]);k=0;for(i=1;i<=n;i++)for(j=i+1;j<=n;j++){p[k].u=i;p[k].v=j;p[k].w=dist(i,j);k++;}sort(p,p+k);for(i=1;i<=n;i++){set[i]=i;rank[i]=1;}sum=0;for(i=0;i<k;i++)if(merge(p[i].u,p[i].v))sum+=p[i].w;printf("The highest possible quality is 1/%d.\n",sum);}return 0;}