POJ 1789 Truck History (Kruskal最小生成树) 模板题
Description
Today, ACM is rich enough to pay historians to study its history. One thing historians tried to find out is so called derivation plan -- i.e. how the truck types were derived. They defined the distance of truck types as the number of positions with different letters in truck type codes. They also assumed that each truck type was derived from exactly one other truck type (except for the first truck type which was not derived from any other type). The quality of a derivation plan was then defined as
1/Σ(to,td)d(to,td)
where the sum goes over all pairs of types in the derivation plan such that to is the original type and td the type derived from it and d(to,td) is the distance of the types.
Since historians failed, you are to write a program to help them. Given the codes of truck types, your program should find the highest possible quality of a derivation plan.
Input
Output
Sample Input
4
aaaaaaa
baaaaaa
abaaaaa
aabaaaa
0
Sample Output
The highest possible quality is 1/3.
题意:每两个点之间都有一条带权边,求最小生成树。因为是稠密图, 所以其实是更适合prim的。。但是这题比较松,krusal也过了
一共有n个点, 有n * n / 2 条边 ,(为防止溢出,要写成n / 2 * n),边数写错会RE
因为是无向图,所以注意一下两个for循环的起点,这样边数才是上面的数量,不然万一写成n * n条边又RE了
模板跑一遍,注意这里kruskal返回的是最小生成树的所有边的权值之和
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
const int maxn = 2000 + 100;//最大点数
const int maxm = maxn / 2 * maxn;//最大边数
int F[maxn];//并查集, F[x]储存x的父节点
int tol;
char a[maxn][7];
struct Edge{
int u, v, w;//储存每条边的两个端点以及边的权值
}edge[maxm];
bool cmp(Edge a, Edge b){
return a.w < b.w;
}
void addedge(int u, int v, int w){//加入最小生成树当中
edge[tol].u = u;
edge[tol].v = v;
edge[tol++].w = w;
}
int find(int x){
if(F[x] == -1) return x;
else return F[x] = find(F[x]);
}
int kruskal(int n){//参数为点的数量
memset(F, -1, sizeof(F));//刚开始每一个点都是一个独立的连通图
int cnt = 0;//已经加入到最小生成树中的边
sort(edge, edge + tol, cmp);
int ans = 0;//最小生成树的边的权值之和
for(int i = 0 ; i < tol; i++){
int u = edge[i].u;
int v = edge[i].v;
int w = edge[i].w;
int t1 = find(u), t2 = find(v);
if(t1 != t2){//u和v不在一个连通图中
ans += w;
F[t1] = t2;
cnt++;
}
if(cnt == n-1) break;
}
if(cnt < n-1) return -1;//不连通
return ans;
}
int getw(int i, int j){
int qq = 0;
for(int k = 0; k <7; k++){
if(a[i][k] != a[j][k])qq++;
}
return qq;
}
int main(){
int n;
//下面建立最小生成树的来源图,即n ^2 /2条边的图
while(scanf("%d", &n) && n){
for(int i = 1; i <= n; i++){
scanf("%s", a[i]);
}
tol = 0;
for(int i = 1; i <= n-1; i++)
for(int j = i; j <= n; j++)addedge(i, j, getw(i, j));
printf("The highest possible quality is 1/%d.\n", kruskal(n));
}
return 0;
}
因为是多组数据,所以memset要放在while里面,不然会WA
POJ 1789 Truck History (Kruskal最小生成树) 模板题的更多相关文章
- POJ 1789 Truck History【最小生成树模板题Kruscal】
题目链接:http://poj.org/problem?id=1789 大意: 不同字符串相同位置上不同字符的数目和是它们之间的差距.求衍生出全部字符串的最小差距. #include<stdio ...
- POJ 1789 Truck History (Kruskal 最小生成树)
题目链接:http://poj.org/problem?id=1789 Advanced Cargo Movement, Ltd. uses trucks of different types. So ...
- POJ 1789 Truck History【最小生成树简单应用】
链接: http://poj.org/problem?id=1789 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
- POJ 1789 Truck History (Kruskal)
题目链接:POJ 1789 Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks ...
- POJ 1789 Truck History (最小生成树)
Truck History 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/E Description Advanced Carg ...
- poj 1789 Truck History(最小生成树)
模板题 题目:http://poj.org/problem?id=1789 题意:有n个型号,每个型号有7个字母代表其型号,每个型号之间的差异是他们字符串中对应字母不同的个数d[ta,tb]代表a,b ...
- poj 1789 Truck History【最小生成树prime】
Truck History Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21518 Accepted: 8367 De ...
- Kuskal/Prim POJ 1789 Truck History
题目传送门 题意:给出n个长度为7的字符串,一个字符串到另一个的距离为不同的字符数,问所有连通的最小代价是多少 分析:Kuskal/Prim: 先用并查集做,简单好写,然而效率并不高,稠密图应该用Pr ...
- POJ 1789 -- Truck History(Prim)
POJ 1789 -- Truck History Prim求分母的最小.即求最小生成树 #include<iostream> #include<cstring> #incl ...
随机推荐
- Quartz.NET总结(八)如何根据自己需要配置Topshelf 服务
前面讲了如何使用Topshelf 快速开发windows服务, 不清楚的可以看之前的这篇文章:https://www.cnblogs.com/zhangweizhong/category/771057 ...
- Netty快速入门(10)Reactor与Netty
Reactor模式 Reactor是1995年由道格拉斯提出的一种高性能网络编程模式.由于好多年了,当时的一些概念与现在略有不同,reactor模式在网络编程中是非常重要的,可以说是NIO框架的典型模 ...
- postgresql gin索引使用
由于属于老项目,postgresql使用版本9.6,主要解决‘%name%"查询无法使用索引问题.pg_trgm模块提供函数和操作符测定字母,数字,文本基于三元模型匹配的相似性, 还有支持快 ...
- Selenium的简单使用
selenium的使用对于新手来说十分友好,因为他避开了如今网络中的异步加载抓取的困扰,使得我们大部分的时间可以用于提取信息和存储中,下面就简单的列一些使用的代码,希望给同样初学的你有一定的参考价值. ...
- Bug的等级程度(Blocker, Critical, Major, Minor/Trivial)及修复优先级
Priority()和Severity(严重程度)是Bug的两个重要属性.很多新人经常混淆这两个概念. 通常,人员在提交Bug时,只定义Bug的Severity, 即该Bug的严重程度, 而将Prio ...
- python 父类方法重写
class Bird: def isWing(self): print("鸟有翅膀") def fly(self): print("鸟会飞") class Os ...
- 【中文乱码】深入分析 Java Web 中的中文编码问题
深入分析 Java Web 中的中文编码问题 1.几种常见的编码格式 1.1 为什么要编码 在计算机中存储信息的最小单元是 1 个字节,即 8 个 bit, 所以能表示的字符范围是 0 ~ 255 个 ...
- Data for the People: How to Make Our Post-Privacy Economy Work for You
等翻译成 chinese在看吧
- 创建模仿存储库 Making a Mock Repository 精通ASP-NET-MVC-5-弗瑞曼 Listing 7-5
- Spring Cloud Alibaba 之 Sentinel 限流规则和控制台实例
这一节我们通过一个简单的实例,学习Sentinel的基本应用. 一.Sentinel 限流核心概念 在学习Sentinel的具体应用之前,我们先来了解一下Sentinel中两个核心的概念,资源和规则. ...