<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>啊哈哈我的ACM之路 - 博客园</title>
<link type="text/css" rel="stylesheet" href="https://common.cnblogs.com/blog/css/common.css?id=20120623"/>
<link id="MainCss" type="text/css" rel="stylesheet" href="https://common.cnblogs.com/Skins/arrow/style.css?id=20120623"/>
<link type="text/css" rel="stylesheet" href="https://common.cnblogs.com/blog/css/common2.css"/>
<link type="text/css" rel="stylesheet" href="https://common.cnblogs.com/css/shStyle.css"/>
<link title="RSS" type="application/rss+xml" rel="alternate" href="https://www.cnblogs.com/myacm/rss"/>
<link title="RSD" type="application/rsd+xml" rel="EditURI" href="https://www.cnblogs.com/myacm/rsd.xml"/>
<link type="application/wlwmanifest+xml" rel="wlwmanifest" href="https://www.cnblogs.com/myacm/wlwmanifest.xml"/>
<script src="https://common.cnblogs.com/script/jquery.js" type="text/javascript"></script>  
<script type="text/javascript">
var currentBlogApp = 'myacm';
</script>
<script src="https://common.cnblogs.com/blog/script/common.js?id=20120623" type="text/javascript"></script> 
<script src="https://common.cnblogs.com/script/json2.js" type="text/javascript"></script>
<script type="text/javascript" src="https://common.cnblogs.com/script/syntaxHighlighter.js"></script>
</head>
<body>
<a name="top"></a>

<!--done-->
<div id="header">
	
<!--done-->
<div class="header">
	<div class="headerText">
		<a id="Header1_HeaderTitle" class="headermaintitle" href="https://www.cnblogs.com/myacm/">我的ACM之路</a><br>
		
	</div>
</div>

</div>
<div id="mylinks">
<!--done-->
<a id="MyLinks1_HomeLink" class="menu" href="https://www.cnblogs.com/">博客园</a>&nbsp;&nbsp;&nbsp;
<a id="MyLinks1_MyHomeLink" class="menu" href="https://www.cnblogs.com/myacm/">首页</a>&nbsp;&nbsp;&nbsp;
<a id="MyLinks1_NewPostLink" class="menu" rel="nofollow" href="https://www.cnblogs.com/myacm/admin/EditPosts.aspx?opt=1">新随笔</a>&nbsp;&nbsp;&nbsp;
<a id="MyLinks1_ContactLink" accesskey="9" class="menu" rel="nofollow" href="https://space.cnblogs.com/msg/send/%e6%88%91%e7%9a%84ACM%e4%b9%8b%e8%b7%af">联系</a>&nbsp;&nbsp;&nbsp;
<a id="MyLinks1_Syndication" class="menu" href="https://www.cnblogs.com/myacm/rss">订阅</a><a id="MyLinks1_XMLLink" href="https://www.cnblogs.com/myacm/rss"><img src="https://www.cnblogs.com/images/xml.gif" alt="订阅" /></a>&nbsp;&nbsp;&nbsp;
<a id="MyLinks1_Admin" class="menu" rel="nofollow" href="https://www.cnblogs.com/myacm/admin/EditPosts.aspx">管理</a>
</div>
<div id="mytopmenu">
	
		
<div class="blogStats">随笔 - 0&nbsp;
文章 - 0&nbsp;评论 - 0&nbsp;trackbacks - 0
</div>
	
</div>
<div id="leftcontent">
	
		<DIV id="leftcontentcontainer">
			<div id="blog-calendar-block" style="display:none"><div id="blog-calendar"></div>
</div><br>
			
<!--done-->
<div class="newsItem">
	<div id="blog-news"></div>
</div>

			<div id="blog-sidecolumn"></div></DIV>		
	
</div>
<div id="centercontent">
	
	
<!--done-->
<div class = "post">
	<div class = "postTitle">
		<h1><a id="cb_post_title_url" class="postTitle2" href="https://www.cnblogs.com/myacm/archive/2012/08/08/2628378.html">最小生成树</a></h1>
	</div>
	<div id="cnblogs_post_body"><div class="cnblogs_code" onclick="cnblogs_code_show('79178847-07da-4b7c-a47a-a82616d217d7')"><img id="code_img_closed_79178847-07da-4b7c-a47a-a82616d217d7" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" /><img id="code_img_opened_79178847-07da-4b7c-a47a-a82616d217d7" class="code_img_opened" style="display: none;" onclick="cnblogs_code_hide('79178847-07da-4b7c-a47a-a82616d217d7',event)" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" /><span class="cnblogs_code_collapse">View Code </span>
<div id="cnblogs_code_open_79178847-07da-4b7c-a47a-a82616d217d7" class="cnblogs_code_hide">
<pre><span style="color: #008080;"> 1</span>  #include&lt;iostream&gt;
<span style="color: #008080;"> 2</span>  #include&lt;cmath&gt;
<span style="color: #008080;"> 3</span>  #include&lt;algorithm&gt;
<span style="color: #008080;"> 4</span>  <span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span><span style="color: #000000;"> std;
</span><span style="color: #008080;"> 5</span>  <span style="color: #0000ff;">#define</span> Max 501
<span style="color: #008080;"> 6</span>  <span style="color: #0000ff;">double</span><span style="color: #000000;"> map[Max][Max],d[Max];
</span><span style="color: #008080;"> 7</span>  <span style="color: #0000ff;">int</span><span style="color: #000000;"> n,i,j;
</span><span style="color: #008080;"> 8</span>  <span style="color: #0000ff;">struct</span><span style="color: #000000;">{
</span><span style="color: #008080;"> 9</span>      <span style="color: #0000ff;">int</span><span style="color: #000000;"> x,y;
</span><span style="color: #008080;">10</span> <span style="color: #000000;"> }point[Max];
</span><span style="color: #008080;">11</span>  <span style="color: #008000;">//</span><span style="color: #008000;">记录从顶点集U到V-U的代价最小的边的辅助数组定义</span>
<span style="color: #008080;">12</span>  <span style="color: #0000ff;">struct</span><span style="color: #000000;">{
</span><span style="color: #008080;">13</span>      <span style="color: #0000ff;">int</span><span style="color: #000000;"> adjvex;
</span><span style="color: #008080;">14</span>      <span style="color: #0000ff;">double</span><span style="color: #000000;"> lowcost;
</span><span style="color: #008080;">15</span> <span style="color: #000000;"> }closedge[Max];
</span><span style="color: #008080;">16</span>  <span style="color: #0000ff;">bool</span> cmp(<span style="color: #0000ff;">double</span> a,<span style="color: #0000ff;">double</span> b)<span style="color: #008000;">//</span><span style="color: #008000;">从大到小偏序</span>
<span style="color: #008080;">17</span> <span style="color: #000000;"> {
</span><span style="color: #008080;">18</span>      <span style="color: #0000ff;">return</span> a&gt;<span style="color: #000000;">b;
</span><span style="color: #008080;">19</span> <span style="color: #000000;"> }
</span><span style="color: #008080;">20</span>  <span style="color: #008000;">//</span><span style="color: #008000;">用普里姆算法从第k个顶点出发构造网G的最小生产树T</span>
<span style="color: #008080;">21</span>  <span style="color: #0000ff;">void</span> prim(<span style="color: #0000ff;">int</span><span style="color: #000000;"> k)
</span><span style="color: #008080;">22</span> <span style="color: #000000;"> {
</span><span style="color: #008080;">23</span>      <span style="color: #0000ff;">for</span>(j=<span style="color: #800080;">1</span>;j&lt;=n;j++)<span style="color: #008000;">//</span><span style="color: #008000;">辅助数组初始化</span>
<span style="color: #008080;">24</span>          <span style="color: #0000ff;">if</span>(j!=<span style="color: #000000;">k)
</span><span style="color: #008080;">25</span> <span style="color: #000000;">         {
</span><span style="color: #008080;">26</span>              closedge[j].adjvex=<span style="color: #000000;">k;
</span><span style="color: #008080;">27</span>              closedge[j].lowcost=<span style="color: #000000;">map[k][j];
</span><span style="color: #008080;">28</span> <span style="color: #000000;">         }
</span><span style="color: #008080;">29</span>      closedge[k].lowcost=<span style="color: #800080;">0</span>; <span style="color: #008000;">//</span><span style="color: #008000;">初始，U={u}</span>
<span style="color: #008080;">30</span>      <span style="color: #0000ff;">int</span> l=<span style="color: #800080;">0</span><span style="color: #000000;">;
</span><span style="color: #008080;">31</span>      <span style="color: #0000ff;">for</span>(i=<span style="color: #800080;">1</span>;i&lt;n;i++)<span style="color: #008000;">//</span><span style="color: #008000;">选择其余n-1个顶点</span>
<span style="color: #008080;">32</span> <span style="color: #000000;">     {
</span><span style="color: #008080;">33</span>          <span style="color: #0000ff;">double</span> min=<span style="color: #800080;">1000000</span><span style="color: #000000;">;
</span><span style="color: #008080;">34</span>          <span style="color: #0000ff;">for</span>(j=<span style="color: #800080;">1</span>;j&lt;=n;j++)<span style="color: #008000;">//</span><span style="color: #008000;">求出T的下一个结点：第k顶点</span>
<span style="color: #008080;">35</span>              <span style="color: #0000ff;">if</span>(closedge[j].lowcost!=<span style="color: #800080;">0</span>&amp;&amp;min&gt;<span style="color: #000000;">closedge[j].lowcost)
</span><span style="color: #008080;">36</span> <span style="color: #000000;">             {
</span><span style="color: #008080;">37</span>                  k=<span style="color: #000000;">j;
</span><span style="color: #008080;">38</span>                  min=<span style="color: #000000;">closedge[j].lowcost;
</span><span style="color: #008080;">39</span> <span style="color: #000000;">             }
</span><span style="color: #008080;">40</span>          closedge[k].lowcost=<span style="color: #800080;">0</span>; <span style="color: #008000;">//</span><span style="color: #008000;">第k顶点并入U集</span>
<span style="color: #008080;">41</span>          d[l++]=map[k][closedge[k].adjvex]; <span style="color: #008000;">//</span><span style="color: #008000;">保存该边</span>
<span style="color: #008080;">42</span>          <span style="color: #0000ff;">for</span>(j=<span style="color: #800080;">1</span>;j&lt;=n;j++) <span style="color: #008000;">//</span><span style="color: #008000;">新顶点并入U后重新选择最小边</span>
<span style="color: #008080;">43</span>              <span style="color: #0000ff;">if</span>(map[k][j]&lt;<span style="color: #000000;">closedge[j].lowcost)
</span><span style="color: #008080;">44</span> <span style="color: #000000;">             {
</span><span style="color: #008080;">45</span>                  closedge[j].adjvex=<span style="color: #000000;">k;
</span><span style="color: #008080;">46</span>                  closedge[j].lowcost=<span style="color: #000000;">map[k][j];
</span><span style="color: #008080;">47</span> <span style="color: #000000;">             }
</span><span style="color: #008080;">48</span> <span style="color: #000000;">     }
</span><span style="color: #008080;">49</span> <span style="color: #000000;"> }
</span><span style="color: #008080;">50</span>  <span style="color: #0000ff;">int</span><span style="color: #000000;"> main()
</span><span style="color: #008080;">51</span> <span style="color: #000000;"> {
</span><span style="color: #008080;">52</span>      <span style="color: #0000ff;">int</span><span style="color: #000000;"> t,m;
</span><span style="color: #008080;">53</span>      cin&gt;&gt;<span style="color: #000000;">t;
</span><span style="color: #008080;">54</span>      <span style="color: #0000ff;">while</span>(t--<span style="color: #000000;">)
</span><span style="color: #008080;">55</span> <span style="color: #000000;">     {
</span><span style="color: #008080;">56</span>          cin&gt;&gt;m&gt;&gt;<span style="color: #000000;">n;
</span><span style="color: #008080;">57</span>          <span style="color: #0000ff;">for</span>(i=<span style="color: #800080;">1</span>;i&lt;=n;i++<span style="color: #000000;">)
</span><span style="color: #008080;">58</span>              cin&gt;&gt;point[i].x&gt;&gt;<span style="color: #000000;">point[i].y;
</span><span style="color: #008080;">59</span>          <span style="color: #0000ff;">for</span>(i=<span style="color: #800080;">1</span>;i&lt;=n;i++) <span style="color: #008000;">//</span><span style="color: #008000;">求出毎两个顶点之间的距离</span>
<span style="color: #008080;">60</span>              <span style="color: #0000ff;">for</span>(j=<span style="color: #800080;">1</span>;j&lt;i;j++<span style="color: #000000;">)
</span><span style="color: #008080;">61</span>                  map[i][j]=map[j][i]=sqrt((point[i].x-point[j].x)*<span style="color: #000000;">(point[i].x
</span><span style="color: #008080;">62</span>                  -point[j].x)+(point[i].y-point[j].y)*(point[i].y-<span style="color: #000000;">point[j].y));
</span><span style="color: #008080;">63</span>          <span style="color: #0000ff;">for</span>(i=<span style="color: #800080;">1</span>;i&lt;=n;i++<span style="color: #000000;">)
</span><span style="color: #008080;">64</span>              map[i][i]=<span style="color: #800080;">1000000</span><span style="color: #000000;">;
</span><span style="color: #008080;">65</span>          prim(<span style="color: #800080;">1</span><span style="color: #000000;">);
</span><span style="color: #008080;">66</span>          sort(d,d+n-<span style="color: #800080;">1</span>,cmp); <span style="color: #008000;">//</span><span style="color: #008000;">把构成最小生成树的n-1条边从大到小排序</span>
<span style="color: #008080;">67</span>          cout.setf(ios::<span style="color: #0000ff;">fixed</span>);<span style="color: #008000;">//</span><span style="color: #008000;">保留两位小数</span>
<span style="color: #008080;">68</span>          cout.precision(<span style="color: #800080;">2</span><span style="color: #000000;">);
</span><span style="color: #008080;">69</span>          cout&lt;&lt;d[m-<span style="color: #800080;">1</span>]&lt;&lt;endl;<span style="color: #008000;">//</span><span style="color: #008000;">数组d从下标0开始存储，即第m条边</span>
<span style="color: #008080;">70</span> <span style="color: #000000;">     }
</span><span style="color: #008080;">71</span>      <span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
</span><span style="color: #008080;">72</span>  }</pre>
</div>
</div>
<p>&nbsp;</p></div><div id="MySignature"></div>
<script type="text/javascript">
var isLogined = true;
var cb_blogId = 124772;
var cb_entryId = 2628378;
var cb_blogApp = currentBlogApp;
var cb_blogUserGuid = "a9e097fd-f1e0-e111-aa3f-842b2b196315";
var cb_entryCreatedDate = '2012/8/8 15:35:00';
var enableGoogleAd = true;
var googletag = googletag || {};
googletag.cmd = googletag.cmd || [];
</script>
<div id="blog_post_info_block">
<div id="blog_post_info">
</div>
<div class="clear"></div>
<div id="post_next_prev"></div>
</div>
<script type="text/javascript">
    initBottomGoogleAd();
</script>
<script type="text/javascript">
    $(function () {       
        fixPostBodyFormat();
        loadBottomGoogleAd();
        loadBlogSignature();
        LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid);
        GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate);
        showEditorOpt();
        loadNewsAndKb();
        GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);
        loadAdUnderGoogle();
    });
</script>
	<div class = "postDesc">posted on <span id="post-date">2012-08-08 15:35</span> <a href='https://www.cnblogs.com/myacm/'>我的ACM之路</a> 阅读(1) 评论(<span id="post-comment-count">0</span>)  <a href ="https://www.cnblogs.com/myacm/admin/EditPosts.aspx?postid=2628378" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(2628378);return false;">收藏</a></div>
</div>
<img src ="https://www.cnblogs.com/myacm/aggbug/2628378.html?type=1&amp;webview=1" width="1" height="1" alt=""/>

<div id="blog-comments-placeholder"></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.loadComments();</script>
<div id="comment_form" class="commentform">
<div id="divCommentShow"></div>
<div id="comment_nav"><span id="span_refresh_tips"></span><a href="javascript:void(0);" id="lnk_RefreshComments" onclick="return RefreshCommentList();">刷新评论</a><a href="#" onclick="return RefreshPage();">刷新页面</a><a href="#top">返回顶部</a></div>
<div id="comment_form_container"></div>

<script type="text/javascript">
    if (typeof commentManager === 'undefined') {
        commentManager = new blogCommentManager();
    }
    commentManager.loadCommentForm();   
</script>

<div class="ad_text_commentbox"><a href="https://q.cnblogs.com/" target="_blank">程序员问答社区，解决您的技术难题</a></div>
<div id="site_nav_under"><a href="https://www.cnblogs.com/" target="_blank" title="程序员的网上家园">博客园首页</a><a href="https://q.cnblogs.com/" target="_blank" title="程序员问答社区">博问</a><a href="https://news.cnblogs.com/" target="_blank" title="IT新闻">新闻</a><a href="https://home.cnblogs.com/ing/" target="_blank">闪存</a><a href="https://job.cnblogs.com/" target="_blank">程序员招聘</a><a href="https://kb.cnblogs.com/" target="_blank">知识库</a><div id="site_editor_opt"></div></div>
<script type="text/javascript">
enableGoogleAd = true;
if ($("#cnblogs_post_body").text().length < 1000) {
    enableGoogleAd = false;
}
</script>
<div id="google_ad_c1" class="c_ad_block">
<div id='div-gpt-ad-1320933818841-0' style='width:300px; height:250px;'>
<script type='text/javascript'>
    if (enableGoogleAd) {
        try {
            googletag.cmd.push(function () { googletag.display('div-gpt-ad-1320933818841-0'); });
        } catch (e) { }
    } else {
        $('#google_ad_c1').hide();
    }
</script>
</div>
</div>
<div id="blog-news-kb"></div>
<div id="google_ad_c2" class="c_ad_block">
<div id='div-gpt-ad-1320933818841-1' style='width:468px; height:60px;'>
<script type='text/javascript'>
    if (enableGoogleAd) {
        try {
            googletag.cmd.push(function () { googletag.display('div-gpt-ad-1320933818841-1'); });
        } catch (e) { }
    } else {
        $('#google_ad_c2').hide();
    }
</script>
</div>
</div>
<div id="ad_under_google" class="c_ad_block" style="display:none;"></div>
<div id="HistoryToday" class="c_ad_block"></div>
</div>





	
<!--done-->
<div class="footer">
	
	Copyright &copy;2012 我的ACM之路 Powered by: <a href="https://www.cnblogs.com" class=footerlink>博客园</a> 模板提供：<a href="https://blog.hjenglish.com" class=footerlink>沪江博客</a><br>
</div>
</div>



<script type="text/javascript" src="https://common.cnblogs.com/script/google-analytics.js"></script>
</body>
</html>
