地道

Time Limit(Common/Java):1000MS/3000MS          Memory Limit:65536KByte
Total Submit:289            Accepted:60

Description

话说南京的城市规划一般一般,各个大学分布极不合理,难于沟通。
我们夜猫族打算用一种常人难以想象的方式建立大学通道:用地道使得所有大学都相通。
但地道的造价不菲,而大学生是贫困群体,所以我们希望用尽量小的代价。
已知建设一条地道的费用和地道的距离成正比。其关系是,一个单位的距离需要的花费是7个ACM币,在ACM世界里货币的换算方法简单极了,29个ACM币等于一个DS币,17个DS币等于一个算法币。(ACM币单位为ac,DS币单位为ds,算法币单位为al)
但是学校太多了,而且有些学校不能直接连接(比如,跨湖或跨江地道太难建设了)。需要聪明的你的帮助。

Input

第一行包含两个整数N,M。N表示学校总数(1≤N≤100),M表示所有能直接连接的学校的数量(1<=M<=N*(N-1)/2)。
以下M行,每行三个正整数,第一个数和第二个数为学校编号,第三个为这两个学校间的距离L(0<=L<=10000)。

Output

若干带单位(ac,ds或al)的正整数,数字要尽可能小,单位复杂一点无妨(即把单位(ac,ds,al)转换得尽可能大,能用大单位表示尽量用大单位)数与单位间无空格。

Sample Input

4 6
1 2 4
1 3 9
1 4 21
2 3 8
2 4 17
3 4 16

Sample Output

6ds22ac

Source

wwm

分析:此题需要求连通所有节点的边的最小值。摸索出了最小生成树。一开始在纠结Dijkstra算法求最短路。注意:Dijkstra算法是单源最短路径算法,适用于计算一个节点到其他所有节点的最短路径。这里显然不适用。

扩展:

一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。

数据结构书中有介绍过,就是不断的加入点,每次都是最短的边。细细体会算法!

于是用Prim算法求最小生成树:

bool vis[101];
int dis[101];
bool prim()
{memset(vis, false, sizeof(vis));for(int i=1;i<=n;i++)dis[i] = INF;ans =0; dis[1] = 0;for(int i=1;i<=n;i++){int tmp = INF, k =0;for(int j=1;j<=n;j++){if(! vis[j] && dis[j] < tmp){tmp = dis[j];k = j;}}if(tmp == INF) return false;vis[k] = true;ans += tmp;for(int j=1;j<=n;j++){if(! vis[j] && dis[j] > a[k][j])dis[j] = a[k][j];}}return true;
}

之后就是用贪心算法求出各种B有多少。(贪心一点都高端好么?)这里的贪心我写的复杂了,其实直接整除就行~又蠢了= =

输出有一些小问题,一开始分情况判断输出,简直蠢 T_T

另外,ACM币一定会输出。

完整代码:

#include<iostream>
#include<algorithm>
using namespace std;
#define INF 1000000000//地道int n, m, a[101][101], ans;
bool vis[101];
int dis[101];
bool prim()
{memset(vis, false, sizeof(vis));for(int i=1;i<=n;i++)dis[i] = INF;ans =0; dis[1] = 0;for(int i=1;i<=n;i++){int tmp = INF, k =0;for(int j=1;j<=n;j++){if(! vis[j] && dis[j] < tmp){tmp = dis[j];k = j;}}if(tmp == INF) return false;vis[k] = true;ans += tmp;for(int j=1;j<=n;j++){if(! vis[j] && dis[j] > a[k][j])dis[j] = a[k][j];}}return true;
}int main()
{int tmp_a, tmp_b, tmp_c, ac = 0, ds = 0, al = 0; // 学校从编号1开始ans = 0;memset(a, 0, sizeof(a));scanf("%d%d",&n,&m);for(int i=0;i<m;i++) {scanf("%d%d%d",&tmp_a,&tmp_b,&tmp_c);a[tmp_a][tmp_b] = tmp_c;a[tmp_b][tmp_a] = tmp_c;}prim();ans *= 7;int tmp = ans;while(ans >= 29){ans -=29;ds ++;}ac = tmp - ds*29;tmp = ds;while(ds >= 17){ds -= 17;al ++;}ds = tmp - al*17;/*if(al == 0) // wrong!{if(ds == 0 && ac != 0)printf("%dds\n",ds);else if(ds != 0 && ac != 0)printf("%dds%dac\n",ds,ac);else // ds != 0 && ac == 0printf("%dac\n",ac);}else{if(ds == 0 && ac == 0)printf("%dal\n",al);else if(ds !=0 && ac == 0)printf("%dal%dac\n",al,ac);else if(ds == 0 && ac != 0)printf("%dal%dds\n",al,ds);elseprintf("%dal%dsa%dac\n",al,ds,ac);}*/if(al != 0)printf("%dal",al);if(ds != 0)printf("%dds",ds);printf("%dac\n",ac);return 0;
}

NOJ1056地道——最小生成树+贪心算法相关推荐

  1. 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...

  2. 并查集与贪心算法的应用之求解无向图的最小生成树

    一,介绍 本文介绍使用Kruskal算法求解无向图的最小生成树.Kruskal是一个贪心算法,并且使用了并查集这种数据结构. 关于并查集的介绍,参考:数据结构--并查集的原理及实现 二,构造一个无向图 ...

  3. 贪心算法——最小生成树

    最小生成树就是在一个无向连通图中,能够包含所有顶点且使得任两个顶点连通,并且包含的路径权值最小的生成树.经典算法是Prim算法和Kruskal算法,他们都是基于贪心算法的. Prim算法的原理是从最小 ...

  4. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

  5. 算法设计与分析第3章 贪心算法

    第4章 贪心算法 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 贪心算法的基本要素 1.贪心选择性质 所谓贪心选择性质是指所 ...

  6. 贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码

    1. 贪心算法概览 贪心算法是一种算法思想.希望能够满足限制的情况下将期望值最大化.比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下用 ...

  7. 最小生成树kruskal算法并查集版 C语言实现

    今天数据结构课讲了最小生成树的Kruskal算法和Prim算法,不过都只是概念,可能是怕他们听不懂吧,反正算法实现一概不讲...囧 下午抱着<算法导论>跑去图书馆看Kruskal算法,发现 ...

  8. 使用贪心算法解决最小生成树问题。

    使用贪心算法解决最小生成树问题. #include<iostream> #include<algorithm> using namespace std; const int M ...

  9. prim算法_贪心算法详解(附例题)

    贪心算法的特征规律 贪心算法,"贪心"二字顾名思义,因此其规律特征就是更加注重当前的状态,贪心法做出的选择是对于当前所处状态的最优选择,它的解决问题的视角是微观的"局部& ...

最新文章

  1. 大数据量表中,增加一个NOT NULL的新列
  2. elementUI+vue-cli el-table=》excel
  3. hell 12 21 filename重定向的含义和区别
  4. C# Thread开启线程几种方式
  5. Remove One Element(贪心)
  6. ptmalloc内存分配和回收详解(文字版)
  7. 来聊一聊,Go 的相对路径问题
  8. python telnet server_python工具库介绍-dubbo:通过telnet接口访问dubbo服务
  9. mvn package时,报错A required class is missing: com/thoughtworks/xstream/io/HierarchicalStreamDriver...
  10. 选用什么云服务器做编程学习比较好?
  11. dw超链接标签_使用Dreamweaver制作网页超链接的详细图文教程--系统之家
  12. 石河子市谷歌高清卫星地图下载
  13. linux修改时间和日期,linux修改时间和日期的方法
  14. sublime 实现浏览器预览功能
  15. 4种预测市场表现的方法
  16. IP地址IP网段合并
  17. 基于ChatGPT实现微信聊天机器人
  18. 建模师是个好职业吗?
  19. HTML详解(1.html简介)
  20. 量化交易策略matlab交易方案,Matlab量化交易策略之 GFTD+止损 附源码

热门文章

  1. 目前最好的家用投影仪,网友强烈推荐这款10款
  2. 别告诉我你懂PPT.pdf
  3. PDF转HTML怎么做?职场小白都在用这几种方法
  4. elecworks 图框管理器
  5. 手机应用注册时,获取国际电话区号列表完美解决方案
  6. OilRig又瞄准了中东电信组织,并在其代码库中增加了带有隐写术的新型C2通道(上)
  7. iOS 字体的加粗和其他样式的效果
  8. GD32F407之LWIP+RTL8201F
  9. 解决IBM Lenovo x3650M5不开机报错system board fault
  10. 随着日益增多的新技术,如何正确的提升自己?