POJ 1789
2015-07-15 10:11
411 查看
最小生成树,题意比较难理解。
建模:
每个字符串可以转化为图上的一点,每两个字符串之间不同的字母的个数可以转化为两点之间的距离,求最小距离即可。
AC代码:
建模:
每个字符串可以转化为图上的一点,每两个字符串之间不同的字母的个数可以转化为两点之间的距离,求最小距离即可。
AC代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; #define maxx 2005 int n; int esum,p[maxx]; struct Edge { int u,v,w; }edge[maxx*maxx/2]; bool cmp(Edge a,Edge b) { return a.w<b.w; } int findpa(int x) { return p[x]==x?x:p[x]=findpa(p[x]); } int kruskal() { for(int i=1;i<=n;i++) p[i]=i; int ans=0,num=0; sort(edge,edge+esum,cmp); for(int i=0;i<esum;i++) { int p1=findpa(edge[i].u); int p2=findpa(edge[i].v); if(p1!=p2) { ans+=edge[i].w; num++; p[p1]=p2; } if(num==n-1) return ans; } return ans; } int main() { char s[maxx][7]; while(scanf("%d",&n)!=EOF&&n) { esum=0; for(int i=1;i<=n;i++) scanf("%s",s[i]); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { int num=0; for(int k=0;k<7;k++) { if(s[i][k]!=s[j][k]) num++; } edge[esum].u=i; edge[esum].v=j; edge[esum].w=num; esum++; } int ans=kruskal(); printf("The highest possible quality is 1/%d.\n",ans); } return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++ Custom Control控件向父窗体发送对应的消息
- C++中拷贝构造函数的应用详解