poj 1789 Truck History 最小生成树

来源:互联网 发布:淘宝毛菇小象 编辑:程序博客网 时间:2024/04/29 20:09

题目地址:poj1789

就是找到一棵树吧。

由于difference是互相的,所以建立无向图。

记得kruskal cc==1时break , 增加边的时候,记得不要重复添加

还是985ms 险过,据说prim会快一点?

代码:

#include<iostream>#include<cstdio>#include<cmath>#include<cstdio>#include<algorithm>#include<cstring>#include<string>const double eps=1e-8;using namespace std;struct edge{    int u;    int v;    int w;   };edge e[4000010];int  fa[2005];int  find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);}bool  edge_cmp(edge a,edge b){    return a.w<b.w;}int n,m;int cc;double   kruskal(){    double  ans=0;    sort(e,e+m,edge_cmp);    for(int i=0;i<m;i++)    {        if(cc==1)  break;        int x=find(e[i].u);        int y=find(e[i].v);                if(x!=y)        {            fa[x]=y;            ans+=e[i].w;            cc--;        }    }        return ans;}void   init(){    for(int i=0;i<n;i++)    {        fa[i]=i;    }    cc=n;}int  calc_difference(char* a,char * b){    int ans=0;    for(int i=0;i<7;i++)    {        if(a[i]!=b[i])   ans++;    }        return ans;}string  s[2005];char c[2005][15];int main(){           while(cin>>n)    {               if(!n)  break;        init();        for(int i=0;i<n;i++)        {            scanf("%s",c[i]);                    }                int cnt=0;        for(int i=0;i<n;i++)            for(int j=i+1;j<n;j++)            {                e[cnt].u=i;                e[cnt].v=j;                e[cnt].w=calc_difference(c[i],c[j]);                cnt++;            }                m=cnt;        int  ans=kruskal();        printf("The highest possible quality is 1/%d.\n",ans);           }    }


0 0
原创粉丝点击