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;}
阅读全文
0 0