POJ 1789 (最小生成树之Kruskal算法)
来源:互联网 发布:广电网络云平台 编辑:程序博客网 时间:2024/05/29 05:12
题目链接:http://poj.org/problem?id=1789
题意:给出多个字符串,每两个字符串之间不同的字符数作为一个字符串衍生出另一个字符串的代价,求出如果衍生出所有的字符串需要的1/Q(Q为总代价)。
这题的难点应该就在于如何将这个问题转化成最小生成树模型。每两个字符串之间都需要连一条线,得到的是一个完全图,然后求出最小生成树。
一开始考虑的是稠密图用Prim()算法,但是想想很久没写Kruskal,于是就写了一发。
然后就是开始被教做人,先是RE一发,发现数组开小了,然后就是TLE7发...
最后加了一个维护树的秩才险过...
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int maxn=2015;int T,n,m;char str[maxn][10];int f[maxn],r[maxn];int get_Weight(char * a,char * b){int res=0;for(int i=0;i<7;i++){if(a[i]!=b[i])res++;}return res;}struct Kruskal{int u;int v;int w;}q[2005000];bool cmp(Kruskal a,Kruskal b){return a.w<b.w;}void Make_Set(){for(int i=0;i<n;i++){f[i]=i;r[i]=1;}}int Find(int x){return x==f[x]?x:Find(f[x]);}bool Union(int a,int b){int ra=Find(a);int rb=Find(b);if(ra==rb)return false;else{if(r[ra]<r[rb]){f[ra]=rb;}else{f[rb]=ra;if(r[ra]==r[rb])r[ra]++;}}return true;}int main(){#ifndef ONLINE_JUDGEfreopen("test.in","r",stdin);freopen("test.out","w",stdout);#endifwhile(~scanf("%d",&n)){if(!n) break;getchar();for(int i=0;i<n;i++){scanf("%s",str[i]);}int num=0;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){q[num].u=i;q[num].v=j;q[num].w=get_Weight(str[i],str[j]);num++;}}int ans=0,cnt=0;Make_Set();sort(q,q+num,cmp);for(int i=0;i<num;i++){if(cnt==n) break;if(Union(q[i].u,q[i].v)){ans+=q[i].w;cnt++;}}printf("The highest possible quality is 1/%d.\n",ans);}return 0;}
0 0
- POJ 1789 (最小生成树之Kruskal算法)
- 最小生成树Kruskal算法,poj 2075
- POJ 2031 最小生成树Kruskal算法
- POJ 1789-Truck History 最小生成树 Kruskal算法
- POJ 1789 Truck History 最小生成树 KRUSKAL算法
- poj-2421 Constructing Roads(最小生成树 Kruskal算法)
- poj 3522 Slim Span(最小生成树)kruskal算法
- poj 2377 最小生成树(kruskal算法)
- Poj 2395 最小生成树(Kruskal 算法)
- POJ:1751 Highways(最小生成树kruskal算法)
- POJ:2485 Highways(最小生成树kruskal算法)
- POJ 2485 Highways (最小生成树 Kruskal算法)
- Poj --1751 highways (最小生成树,kruskal算法)
- poj 1751 Highways 最小生成树之Kruskal(克鲁斯卡尔)算法
- POJ 1258(最小生成树之Kruskal)
- 最小生成树之Kruskal算法
- 最小生成树之kruskal算法
- 贪心算法之最小生成树Kruskal
- c3p0详细配置
- POJ 2421 Constructing Roads
- poj1852
- 常用的字符串哈希函数
- RPM基本使用指南
- POJ 1789 (最小生成树之Kruskal算法)
- Leetcode 27. Remove Element
- Codeforces round 440 div2 总结&&题解
- 用CreateDirectory创建文件目录
- latex 基本用法(二)
- Google C++编程风格指南(二)之函数的相关规范
- python 操作符**与*的用法
- YUM(Yellow dog Updater, Modified)使用详解
- Codeforce round340 div2