POJ

来源:互联网 发布:广告文案的100案例知乎 编辑:程序博客网 时间:2024/06/06 11:41

题目链接:http://poj.org/problem?id=1789

题意:给你n个size为7的字符串,两个之间的权值就是两个字符串中不同字符的个数。问你从把每个字符串都连起来要最少要多少。

思路:如果能想到用最小生成树还是挺简单的,直接构造就好了。

注意:用string好人cin就会T,用char就不会。。。


代码:

#include <cstdio>#include <cmath>#include <iostream>#include <cstring>#include <algorithm>#include <queue>#include <stack>#include <vector>#include <map>#include <numeric>#include <set>#include <string>#include <cctype>#include <sstream>#define INF 0x3f3f3f3fusing namespace std;typedef long long LL;typedef pair<int, int> P;const int maxn = 5e6 + 5;int n,p[2005],cnt;char s[maxn][10];struct edge{    int u,v,cost;}e[maxn];bool cmp(edge a,edge b){    return a.cost<b.cost;}void init (int n) {for (int i=0;i<=n;i++) p[i]=i;}int Find(int x) {return p[x]==x?x: ( p[x]=Find ( p[x] ) );}bool same(int a,int b) {return Find(a)==Find(b);}void unite (int x,int y){    x=Find(x);    y=Find(y);    if (x!=y)  p[x]=y;}int num(char *s1,char *s2){    int sum=0;    for (int i=0;i<7;i++){        if (s1[i]!=s2[i]) sum++;    }    return sum;}int kruskal(){    sort(e,e+cnt,cmp);    int ans=0;    for (int i=0;i<cnt;i++){        edge ee=e[i];        if (!same(ee.u,ee.v)){            unite(ee.u,ee.v);            ans+=ee.cost;        }    }    return ans;}int main () {    //freopen ("in.txt", "r", stdin);    while (~scanf ("%d",&n)&&n){        init(n);        for (int i=0;i<n;i++){            scanf ("%s",s[i]);        }        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++].cost=num(s[i],s[j]);            }        }        printf ("The highest possible quality is 1/%d.\n",kruskal());    }    return 0;}


原创粉丝点击