http://poj.org/problem?id=1789

这是一道图论的题,个人觉得和那个POJ1258是差不多的,就是多了一步,题目难以读懂

题目的意思:就是给你一群字符串要你找字符串对应的字符不同,使得这个字符串与其他字符串不同

举个例子,不然题目也确实看不懂,

4

a b a a a b a

b a a a a b a

b a a b b a b

a b a a a a a

以第一个为主的与其他行不同的字母数分别为:0 2 6 1

以第二个为主的与其他行不同的字母数分别为:2 0 4 3

以第三个为主的与其他行不同的字母数分别为:6 4 0 5

以第四个为主的与其他行不同的字母数分别为:1 3 5 0

所求的最短的不是2+6+1=9;

而应该是 1+2+4,这才是最短的,这就是prim。

而所谓的prim,就是首先以一个节点作为最小生成树的初始节点,然后以迭代的方式找出与最小生成树中各节点权重最小的边。

用代码来解释是比较好的。

 #include <stdio.h>
#include <iostream>
#include <string.h>
#include <string> using namespace std; #define inf 100007
char str[][];
int dis[],n,ans,mp[][];
bool vis[];
void creatmp()
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
ans=;
for(int k=;k<;k++)
if(str[i][k]!=str[j][k]) ans++;
mp[i][j]=ans;
}
} bool prim()
{
ans=;
for(int i=;i<=n;i++) //对dis进行初始化,这里的dis指的就是两个字符串对应位置的字符的不同总值。
dis[i]=inf;
dis[]=;    //因为相同字符串是相同的,所以这个为0。
for(int i=;i<=n;i++)
{
int tmp=inf;int k=;
for(int j=;j<=n;j++)
if(vis[j]&&dis[j]<tmp) //找出dis最小的,并记录。
{
tmp=dis[j];
k=j;
}
if(tmp==inf) return false;
ans+=tmp;
vis[k]=false;
for(int j=;j<=n;j++) //用dis来记录每一列。
if(vis[j]&&dis[j]>mp[k][j])
dis[j]=mp[k][j];
}
return true;
} int main()
{
while(scanf("%d",&n)&&n!=)
{
memset(vis,true,sizeof(vis));
for(int i=;i<=n;i++)
scanf("%s",str[i]);
creatmp();
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
printf("%d ",mp[i][j]);
printf("\n");}
prim();
printf("The highest possible quality is 1/%d.\n",ans);
}
}

poj 1789的更多相关文章

  1. poj 1789 prime

    链接:Truck History - POJ 1789 - Virtual Judge  https://vjudge.net/problem/POJ-1789 题意:先给出一个n,代表接下来字符串的 ...

  2. Kuskal/Prim POJ 1789 Truck History

    题目传送门 题意:给出n个长度为7的字符串,一个字符串到另一个的距离为不同的字符数,问所有连通的最小代价是多少 分析:Kuskal/Prim: 先用并查集做,简单好写,然而效率并不高,稠密图应该用Pr ...

  3. POJ 1789 -- Truck History(Prim)

     POJ 1789 -- Truck History Prim求分母的最小.即求最小生成树 #include<iostream> #include<cstring> #incl ...

  4. POJ 1789 Truck History (Kruskal)

    题目链接:POJ 1789 Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks ...

  5. poj 1789 Truck History

    题目连接 http://poj.org/problem?id=1789 Truck History Description Advanced Cargo Movement, Ltd. uses tru ...

  6. poj 1789 Truck History(最小生成树)

    模板题 题目:http://poj.org/problem?id=1789 题意:有n个型号,每个型号有7个字母代表其型号,每个型号之间的差异是他们字符串中对应字母不同的个数d[ta,tb]代表a,b ...

  7. poj 1789 Truck History(kruskal算法)

    主题链接:http://poj.org/problem?id=1789 思维:一个一个点,每两行之间不懂得字符个数就看做是权值.然后用kruskal算法计算出最小生成树 我写了两个代码一个是用优先队列 ...

  8. POJ 1789 Truck History (Kruskal 最小生成树)

    题目链接:http://poj.org/problem?id=1789 Advanced Cargo Movement, Ltd. uses trucks of different types. So ...

  9. (最小生成树)Truck History --POJ -- 1789

    链接: http://poj.org/problem?id=1789 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 2213 ...

随机推荐

  1. jQuery 参考手册 - 遍历

    jQuery 参考手册 - 遍历 jQuery Ajax jQuery 数据 jQuery 遍历函数 jQuery 遍历函数包括了用于筛选.查找和串联元素的方法. 函数描述 .add()将元素添加到匹 ...

  2. monit 监控并自动重启服务

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://coolerfeng.blog.51cto.com/133059/50126 Mo ...

  3. [git]添加项目到git

    写在前面 一直在想把代码托管到git上面,一直没有去研究,最近发现自己写的demo,好多都找不到了,实在是没办法了,耐下心研究了下git.这里通过添加了自己做的demo,算是也是学习下git的操作吧. ...

  4. [慢查优化]联表查询注意谁是驱动表 & 你搞不清楚谁join谁更好时请放手让mysql自行判定

    写在前面的话: 不要求每个人一定理解 联表查询(join/left join/inner join等)时的mysql运算过程: 不要求每个人一定知道线上(现在或未来)哪张表数据量大,哪张表数据量小: ...

  5. php 短路逻辑运算符

    短路与 && 短路或 || or.||.and.&& 都是短路运算符 &&(and)短路与运算符检查第一个表达式是否返回“flase”,如果是“fals ...

  6. springMVC 缓存(入门 spring+mybaties+redis一)

    使用redis之前需要咋电脑上安装redis: 使用spring+mybaties+redis的本质是扩展类   org.apache.ibatis.cache.Cache:在我们自己扩展的Cache ...

  7. python简明手册学习

    1.行末单独一个反斜杠表示字符串在下一行继续,而不是开始一个新的行. >>> "This is the first sentence.\ ... This is the s ...

  8. codevs2574 波兰表达式

    题目描述 Description 对于 加.减.乘.除这种四则运算的表达式,我们使用的是先乘除.后加减的从左到右的顺序进行运算,如果要指定特定的顺序,就要增加括号进行表达,比如 (A+B)*C , A ...

  9. button 按钮

    <!DOCTYPE html> <html> <body> <h1>我的第一段 JavaScript</h1> <p> Java ...

  10. 如何设计PHP业务模块(函数/方法)返回结果的结构?

    如题:如何设计业务模块返回结果的结构? 一个业务函数/方法执行后,对外输出数据的结构通常有以下几种: 1.返回数字,如 成功时返回 0,失败时返回 -1,有的还会用一个全局变量输出错误信息: < ...