﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-sunfruit[www.sunfruit.org]-随笔分类-数据结构</title><link>http://www.blogjava.net/sunfruit/category/14706.html</link><description>--我相信JAVA能走得更远 MSN:cuij7718@hotmail.com或sunfruit_cn@hotmail.com   QQ:316228067</description><language>zh-cn</language><lastBuildDate>Thu, 29 Nov 2007 18:34:30 GMT</lastBuildDate><pubDate>Thu, 29 Nov 2007 18:34:30 GMT</pubDate><ttl>60</ttl><item><title>[原创]图论应用--最短路径</title><link>http://www.blogjava.net/sunfruit/archive/2006/10/23/76828.html</link><dc:creator>sunfruit</dc:creator><author>sunfruit</author><pubDate>Mon, 23 Oct 2006 13:17:00 GMT</pubDate><guid>http://www.blogjava.net/sunfruit/archive/2006/10/23/76828.html</guid><wfw:comment>http://www.blogjava.net/sunfruit/comments/76828.html</wfw:comment><comments>http://www.blogjava.net/sunfruit/archive/2006/10/23/76828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunfruit/comments/commentRss/76828.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunfruit/services/trackbacks/76828.html</trackback:ping><description><![CDATA[		<p>&#160;&#160;&#160; --sunfruit<br /><img height="252" src="http://www.zsqz.com/jsbase/datastructure/basic/graph/tulun/tl_zdlj.gif" width="573" /><br />求上图1点到其他各点的最短路径，依据图论知识建立矩阵模型，进一步得到代码如下<br /><br />public class ShortPathA {</p>
		<p>&#160; private static int[][]<br />&#160;&#160;&#160;&#160;&#160; a = {<br />&#160;&#160;&#160;&#160;&#160; {0, 50, 10, 100000, 45, 100000}, {100000, 0, 15, 100000, 10, 100000}, {20, 100000, 0, 15, 100000, 100000}, {<br />&#160;&#160;&#160;&#160;&#160; 100000, 20, 100000, 0, 35, 100000}, {100000, 100000, 1000000, 30, 0, 100000}, {100000, 100000, 100000, 3, 100000, 0}<br />&#160; };</p>
		<p>&#160; private static boolean[] mark = new boolean[a.length];<br />&#160; public ShortPathA() {<br />&#160;&#160;&#160; int Vo = 0; //源点<br />&#160;&#160;&#160; //源点到其他各点的距离<br />&#160;&#160;&#160; int[] b = new int[a.length];<br />&#160;&#160;&#160; DynArrayInt S = new DynArrayInt();<br />&#160;&#160;&#160; for (int i = 0; i &lt; a.length; i++) {<br />&#160;&#160;&#160;&#160;&#160; mark[i] = false;<br />&#160;&#160;&#160;&#160;&#160; //b[i] = a[Vo][i];<br />&#160;&#160;&#160; }<br />&#160;&#160;&#160; int best = -1;<br />&#160;&#160;&#160; mark[0] = true;<br />&#160;&#160;&#160; b[0] = 0; //{0为源点}<br />&#160;&#160;&#160; while (best != 0) {<br />&#160;&#160;&#160;&#160;&#160; best = 0;<br />&#160;&#160;&#160;&#160;&#160; int best_j = 0;<br />&#160;&#160;&#160;&#160;&#160; for (int i = 0; i &lt; b.length; i++)<br />&#160;&#160;&#160;&#160;&#160; {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (mark[i]) //{对每一个已计算出最短路径的点}<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int j = 0; j &lt; b.length; j++) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ( (!mark[j]) &amp;&amp; (a[i][j] &gt; 0)) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ( (best == 0) || (b[i] + a[i][j] &lt; best)) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; best = b[i] + a[i][j];<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; best_j = j;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160; if (best &gt; 0) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; b[best_j] = best;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; mark[best_j] = true;<br />&#160;&#160;&#160;&#160;&#160; }</p>
		<p>&#160;&#160;&#160; }<br />&#160;&#160;&#160; System.out.println(java.util.Arrays.toString(b));<br />&#160; }</p>
		<p>&#160; public static void main(String[] args) {<br />&#160;&#160;&#160; ShortPathA shortpath = new ShortPathA();<br />&#160; }</p>
		<p>}</p>
 <img src ="http://www.blogjava.net/sunfruit/aggbug/76828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunfruit/" target="_blank">sunfruit</a> 2006-10-23 21:17 <a href="http://www.blogjava.net/sunfruit/archive/2006/10/23/76828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]图论应用--一笔画问题</title><link>http://www.blogjava.net/sunfruit/archive/2006/08/31/66859.html</link><dc:creator>sunfruit</dc:creator><author>sunfruit</author><pubDate>Thu, 31 Aug 2006 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/sunfruit/archive/2006/08/31/66859.html</guid><wfw:comment>http://www.blogjava.net/sunfruit/comments/66859.html</wfw:comment><comments>http://www.blogjava.net/sunfruit/archive/2006/08/31/66859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunfruit/comments/commentRss/66859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunfruit/services/trackbacks/66859.html</trackback:ping><description><![CDATA[
		<p>    --sunfruit<br /><img height="91" alt="tu1_2.gif" src="http://www.blogjava.net/images/blogjava_net/sunfruit/tu1_2.gif" width="185" border="0" /><br />上图求一笔画的路径，利用图论的相关知识可以得到程序如下：<br /><br />public class OnePath {</p>
		<p>    private static int[][]<br />            links = { {0,1,1,0,0,0,1,0}, {1,0,0,1,0,0,0,1}, {1,0,0,1,1,1,0,0},<br />            {0,1,1,0,1,1,0,0}, {0,0,1,1,0,1,1,0}, {0,0,1,1,1,0,0,1}, {1,0,0,0,1,0,0,0}, {0,1,0,0,0,1,0,0}<br />    };</p>
		<p>    public OnePath() {<br />        int sum = 0;<br />        //存放每个点的度<br />        int[] point = new int[links[0].length];<br />        for (int i = 0; i &lt; links[0].length; i++) {<br />            int[] templink = links[i];<br />            for (int j = 0; j &lt; links[0].length; j++) {<br />                point[i] += templink[j];<br />            }<br />            sum += point[i];<br />        }</p>
		<p>        //计算度数是奇数点的个数,如果大于2则不能一笔画<br />        int odt = 0;<br />        int start = -1;<br />        for (int i = 0; i &lt; point.length; i++) {<br />            int mod = point[i] % 2;<br />            if (mod &gt; 0) {<br />                //if(start==-1)<br />                    start = i;<br />                odt++;<br />            }<br />        }<br />        if(odt&gt;2)<br />        {<br />          System.out.println("该图不能一笔画");<br />          return;<br />        }<br />        int r = 0;<br />        //从一个奇数点开始计算<br />        int nowd=start;<br />        System.out.print(nowd+1);<br />        while (sum &gt; 0) {<br />            r=0;<br />            //对于起点nowd 检查当前的点r 是否合适<br />            //links[nowd][r]==0 判断是否有可以走的没有用过的线路<br />            //(point[r]&lt;=1 &amp;&amp; sum!=2) 判断是否是最后一次，如果不是最后一次，那么避开度数是1的点<br />            while (links[nowd][r]==0 || (point[r]&lt;=1 &amp;&amp; sum!=2)) {<br />                r++;<br />            }<br />            links[nowd][r]=0; //已经用过的线路<br />            links[r][nowd]=0; //已经用过的线路 links[nowd][r] links[r][nowd]互为往返路线,用过1-&gt;2那么2-&gt;1也作废了<br />            sum=sum-2; //总度数减2 因为从1-&gt;2 消耗了1的度和2的度<br />            point[nowd]--; //起点和终点的度都减1 1-&gt;2 那么1的度和2的度都减1<br />            point[r]--; //起点和终点的度都减1 1-&gt;2 那么1的度和2的度都减1<br />            nowd =r; //设置新的起点<br />            System.out.print("-&gt;"+(r+1));<br />        }<br />    }</p>
		<p>    public static void main(String[] args) {<br />        new OnePath();<br />    }</p>
		<p>}</p>
<img src ="http://www.blogjava.net/sunfruit/aggbug/66859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunfruit/" target="_blank">sunfruit</a> 2006-08-31 14:20 <a href="http://www.blogjava.net/sunfruit/archive/2006/08/31/66859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>