<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: graph code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Thu, 24 Jul 2008 22:02:54 GMT</pubDate>
    <description>DZone Snippets: graph code</description>
    <item>
      <title>Generate a graph using Gruff</title>
      <link>http://snippets.dzone.com/posts/show/5168</link>
      <description>This Ruby code produced a graph using gruff.  The output shows a &lt;a href="http://twitxr.com/image/6822/"&gt;line graph&lt;/a&gt; [twitxr.com] for the different fruits. Source code origin: &lt;a href="http://nubyonrails.com/pages/gruff"&gt;Gruff Update With Bar Graphs | Ruby on Rails for Newbies&lt;/a&gt; [rubyonrails.com]&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'gruff'&lt;br /&gt;&lt;br /&gt;g = Gruff::Line.new&lt;br /&gt;g.title = "My Graph" &lt;br /&gt;&lt;br /&gt;g.data("Apples", [1, 2, 3, 4, 4, 3])&lt;br /&gt;g.data("Oranges", [4, 8, 7, 9, 8, 9])&lt;br /&gt;g.data("Watermelon", [2, 3, 1, 5, 6, 8])&lt;br /&gt;g.data("Peaches", [9, 9, 10, 8, 7, 9])&lt;br /&gt;&lt;br /&gt;g.labels = {0 =&gt; '2003', 2 =&gt; '2004', 4 =&gt; '2005'}&lt;br /&gt;&lt;br /&gt;g.write('my_fruity_graph.png')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Note: I executed the code within an irb session on my Gentoo box. With Gentoo, &lt;a href="http://gentoo-portage.com/dev-ruby/gruff"&gt;Gruff was installed&lt;/a&gt; [gentoo-portage.com] using the command emerge -va gruff. I tried installing it on Ubuntu but ran into some difficulty, even with help from the article &lt;a href="http://snippets.dzone.com/posts/show/4140"&gt;install rmagick ubuntu&lt;/a&gt; [dzone.com].&lt;br /&gt;&lt;br /&gt;*udpate 21:48 24-Feb*&lt;br /&gt;&lt;br /&gt;The following code does exactly as the same code above, however it uses XML to separate the data from the process, making it easier and more efficient to build graphs.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/ruby&lt;br /&gt;# file: xml2gruff.rb&lt;br /&gt;&lt;br /&gt;require 'rexml/document'&lt;br /&gt;require 'gruff'&lt;br /&gt;include REXML&lt;br /&gt;&lt;br /&gt;class Xml2Gruff&lt;br /&gt;  &lt;br /&gt;  def initialize(filename)&lt;br /&gt;    file = File.new(filename, 'r')&lt;br /&gt;    doc = Document.new(file)&lt;br /&gt;    # get the title&lt;br /&gt;    @title = doc.root.elements['summary/title'].text&lt;br /&gt;    &lt;br /&gt;    @record = Hash.new&lt;br /&gt;    # get each record&lt;br /&gt;    doc.root.elements.each('records/item') {|item|&lt;br /&gt;      avalues = Array.new&lt;br /&gt;      item.elements.each('values/value') { |value| avalues &lt;&lt; value.text.to_i }&lt;br /&gt;      @record[item.elements['label'].text] = avalues&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    # get the summary labels&lt;br /&gt;    @labels = Hash.new  &lt;br /&gt;    doc.root.elements.each('summary/scale/label') {|l| @labels[l.elements['value'].text.to_i] = l.elements['title'].text} &lt;br /&gt;    &lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def save_line_graph(filename)&lt;br /&gt;&lt;br /&gt;    g = Gruff::Line.new&lt;br /&gt;    g.title = @title &lt;br /&gt;    @record.each {|label, data| g.data(label, data) }&lt;br /&gt;    g.labels = @labels&lt;br /&gt;    g.write(filename)&lt;br /&gt;&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;if __FILE__ == $0&lt;br /&gt; x2g = Xml2Gruff.new('my_fruit.xml')&lt;br /&gt; x2g.save_line_graph('my_fruit2.png')&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;file: my_fruit.xml&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;graph&gt;&lt;br /&gt;  &lt;summary&gt;&lt;br /&gt;    &lt;title&gt;My Graph&lt;/title&gt;&lt;br /&gt;    &lt;scale&gt;&lt;br /&gt;      &lt;label&gt;&lt;title&gt;2003&lt;/title&gt;&lt;value&gt;0&lt;/value&gt;&lt;/label&gt;&lt;br /&gt;      &lt;label&gt;&lt;title&gt;2004&lt;/title&gt;&lt;value&gt;2&lt;/value&gt;&lt;/label&gt;&lt;br /&gt;      &lt;label&gt;&lt;title&gt;2005&lt;/title&gt;&lt;value&gt;4&lt;/value&gt;&lt;/label&gt;&lt;br /&gt;    &lt;/scale&gt;&lt;br /&gt;  &lt;/summary&gt;&lt;br /&gt;  &lt;records&gt;&lt;br /&gt;    &lt;item&gt;&lt;br /&gt;      &lt;label&gt;Apples&lt;/label&gt;&lt;br /&gt;      &lt;values&gt;&lt;value&gt;1&lt;/value&gt;&lt;value&gt;2&lt;/value&gt;&lt;value&gt;3&lt;/value&gt;&lt;value&gt;4&lt;/value&gt;&lt;value&gt;4&lt;/value&gt;&lt;value&gt;3&lt;/value&gt;&lt;/values&gt;&lt;br /&gt;    &lt;/item&gt;&lt;br /&gt;    &lt;item&gt;&lt;br /&gt;      &lt;label&gt;Oranges&lt;/label&gt;&lt;br /&gt;      &lt;values&gt;&lt;value&gt;4&lt;/value&gt;&lt;value&gt;8&lt;/value&gt;&lt;value&gt;7&lt;/value&gt;&lt;value&gt;9&lt;/value&gt;&lt;value&gt;8&lt;/value&gt;&lt;value&gt;9&lt;/value&gt;&lt;/values&gt;&lt;br /&gt;    &lt;/item&gt;&lt;br /&gt;    &lt;item&gt;&lt;br /&gt;      &lt;label&gt;Watermelon&lt;/label&gt;&lt;br /&gt;      &lt;values&gt;&lt;value&gt;2&lt;/value&gt;&lt;value&gt;3&lt;/value&gt;&lt;value&gt;1&lt;/value&gt;&lt;value&gt;5&lt;/value&gt;&lt;value&gt;6&lt;/value&gt;&lt;value&gt;8&lt;/value&gt;&lt;/values&gt;&lt;br /&gt;    &lt;/item&gt;&lt;br /&gt;    &lt;item&gt;&lt;br /&gt;      &lt;label&gt;Peaches&lt;/label&gt;&lt;br /&gt;      &lt;values&gt;&lt;value&gt;9&lt;/value&gt;&lt;value&gt;9&lt;/value&gt;&lt;value&gt;10&lt;/value&gt;&lt;value&gt;8&lt;/value&gt;&lt;value&gt;7&lt;/value&gt;&lt;value&gt;9&lt;/value&gt;&lt;/values&gt;&lt;br /&gt;    &lt;/item&gt;&lt;br /&gt;  &lt;/records&gt;&lt;br /&gt;&lt;/graph&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Reference: &lt;a href="http://gruff.rubyforge.org/"&gt;gruff's gruff-0.2.9 Documentation&lt;/a&gt; [rubyforge.org]&lt;br /&gt;&lt;a href="http://www.google.com/url?sa=t&amp;ct=res&amp;cd=4&amp;url=http%3A%2F%2Ftopfunky.com%2Fclients%2Fblog%2F2006%2Fcanada_on_rails_gruff.pdf&amp;ei=2urBR-elJYe6-ALryoX2DA&amp;usg=AFQjCNEc0leNwpB7ai1MeHjDO3eD1T_kiQ&amp;sig2=SgqtwiMT6yb1-zOUqOl8pw"&gt;gruff graphs for ruby by geoffrey grosenbach&lt;/a&gt; [topfunky.com]</description>
      <pubDate>Sun, 24 Feb 2008 18:52:14 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5168</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Speeding up Dijkstra's Algorithm</title>
      <link>http://snippets.dzone.com/posts/show/4996</link>
      <description>Demonstrates a way of speeding up the O(n&lt;sup&gt;2&lt;/sup&gt;) version of Dijkstra's Algorithm by about 4x.&lt;br /&gt;&lt;br /&gt;Here, dist[][] is the adjacency matrix representing the graph and n is the number of nodes. d2[] is where the lengths of the shortest paths are saved.&lt;br /&gt;&lt;br /&gt;For a full explanation, see &lt;a href="http://compprog.wordpress.com/2008/01/17/speeding-up-dijkstras-algorithm-1/"&gt;this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void dijkstra2(int s) {&lt;br /&gt;	int queue[GRAPHSIZE];&lt;br /&gt;	char inQueue[GRAPHSIZE];&lt;br /&gt;	int begq = 0,&lt;br /&gt;	    endq = 0;&lt;br /&gt;	int i, mini;&lt;br /&gt;	int visited[GRAPHSIZE];&lt;br /&gt;&lt;br /&gt;	for (i = 1; i &lt;= n; ++i) {&lt;br /&gt;		d2[i] = INFINITY;&lt;br /&gt;		visited[i] = 0; /* the i-th element has not yet been visited */&lt;br /&gt;		inQueue[i] = 0;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	d2[s] = 0;&lt;br /&gt;	queue[endq] = s;&lt;br /&gt;	endq = (endq + 1) % GRAPHSIZE;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	while (begq != endq) {&lt;br /&gt;		mini = queue[begq];&lt;br /&gt;		begq = (begq + 1) % GRAPHSIZE;&lt;br /&gt;		inQueue[mini] = 0;&lt;br /&gt;&lt;br /&gt;		visited[mini] = 1;&lt;br /&gt;&lt;br /&gt;		for (i = 1; i &lt;= n; ++i)&lt;br /&gt;			if (dist[mini][i])&lt;br /&gt;				if (d2[mini] + dist[mini][i] &lt; d2[i]) { &lt;br /&gt;					d2[i] = d2[mini] + dist[mini][i];&lt;br /&gt;					if (!inQueue[i]) {&lt;br /&gt;						queue[endq] = i;&lt;br /&gt;						endq = (endq + 1) % GRAPHSIZE;&lt;br /&gt;						inQueue[i] = 1;&lt;br /&gt;					}&lt;br /&gt;				}&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 17 Jan 2008 15:57:42 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4996</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>Dijkstra's Algorithm</title>
      <link>http://snippets.dzone.com/posts/show/4832</link>
      <description>This is a simple O(n^2) implementation of &lt;a href="http://en.wikipedia.org/wiki/Dijkstra's_algorithm"&gt;Dijkstra's algorithm&lt;/a&gt; for finding the shortest paths from a single source to all nodes in a graph.&lt;br /&gt;&lt;br /&gt;Further explanation is given &lt;a href="http://compprog.wordpress.com/2007/12/01/one-source-shortest-path-dijkstras-algorithm/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;#define GRAPHSIZE 2048&lt;br /&gt;#define INFINITY GRAPHSIZE*GRAPHSIZE&lt;br /&gt;#define MAX(a, b) ((a &gt; b) ? (a) : (b))&lt;br /&gt;&lt;br /&gt;int e; /* The number of nonzero edges in the graph */&lt;br /&gt;int n; /* The number of nodes in the graph */&lt;br /&gt;long dist[GRAPHSIZE][GRAPHSIZE]; /* dist[i][j] is the distance between node i and j; or 0 if there is no direct connection */&lt;br /&gt;long d[GRAPHSIZE]; /* d[i] is the length of the shortest path between the source (s) and node i */&lt;br /&gt;&lt;br /&gt;void printD() {&lt;br /&gt;	int i;&lt;br /&gt;	for (i = 1; i &lt;= n; ++i)&lt;br /&gt;		printf("%10d", i);&lt;br /&gt;	printf("\n");&lt;br /&gt;	for (i = 1; i &lt;= n; ++i) {&lt;br /&gt;		printf("%10ld", d[i]);&lt;br /&gt;	}&lt;br /&gt;	printf("\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void dijkstra(int s) {&lt;br /&gt;	int i, k, mini;&lt;br /&gt;	int visited[GRAPHSIZE];&lt;br /&gt;&lt;br /&gt;	for (i = 1; i &lt;= n; ++i) {&lt;br /&gt;		d[i] = INFINITY;&lt;br /&gt;		visited[i] = 0; /* the i-th element has not yet been visited */&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	d[s] = 0;&lt;br /&gt;&lt;br /&gt;	for (k = 1; k &lt;= n; ++k) {&lt;br /&gt;		mini = -1;&lt;br /&gt;		for (i = 1; i &lt;= n; ++i)&lt;br /&gt;			if (!visited[i] &amp;&amp; ((mini == -1) || (d[i] &lt; d[mini])))&lt;br /&gt;				mini = i;&lt;br /&gt;&lt;br /&gt;		visited[mini] = 1;&lt;br /&gt;&lt;br /&gt;		for (i = 1; i &lt;= n; ++i)&lt;br /&gt;			if (dist[mini][i])&lt;br /&gt;				if (d[mini] + dist[mini][i] &lt; d[i]) &lt;br /&gt;					d[i] = d[mini] + dist[mini][i];&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt;	int i, j;&lt;br /&gt;	int u, v, w;&lt;br /&gt;&lt;br /&gt;	FILE *fin = fopen("dist.txt", "r");&lt;br /&gt;	fscanf(fin, "%d", &amp;e);&lt;br /&gt;	for (i = 0; i &lt; e; ++i)&lt;br /&gt;		for (j = 0; j &lt; e; ++j)&lt;br /&gt;			dist[i][j] = 0;&lt;br /&gt;	n = -1;&lt;br /&gt;	for (i = 0; i &lt; e; ++i) {&lt;br /&gt;		fscanf(fin, "%d%d%d", &amp;u, &amp;v, &amp;w);&lt;br /&gt;		dist[u][v] = w;&lt;br /&gt;		n = MAX(u, MAX(v, n));&lt;br /&gt;	}&lt;br /&gt;	fclose(fin);&lt;br /&gt;&lt;br /&gt;	dijkstra(1);&lt;br /&gt;&lt;br /&gt;	printD();&lt;br /&gt;&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 01 Dec 2007 19:41:53 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4832</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>Bellman-Ford Algorithm</title>
      <link>http://snippets.dzone.com/posts/show/4828</link>
      <description>This is a simple implementation of the &lt;a href="http://en.wikipedia.org/wiki/Bellman-ford"&gt;Bellman-Ford&lt;/a&gt; algorithm for finding the shortest path from a single source in a graph.&lt;br /&gt;&lt;br /&gt;A detailed explanation is given &lt;a href="http://compprog.wordpress.com/2007/11/29/one-source-shortest-path-the-bellman-ford-algorithm/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;typedef struct {&lt;br /&gt;	int u, v, w;&lt;br /&gt;} Edge;&lt;br /&gt;&lt;br /&gt;int n; /* the number of nodes */&lt;br /&gt;int e; /* the number of edges */&lt;br /&gt;Edge edges[1024]; /* large enough for n &lt;= 2^5=32 */&lt;br /&gt;int d[32]; /* d[i] is the minimum distance from node s to node i */&lt;br /&gt;&lt;br /&gt;#define INFINITY 10000&lt;br /&gt;&lt;br /&gt;void printDist() {&lt;br /&gt;	int i;&lt;br /&gt;&lt;br /&gt;	printf("Distances:\n");&lt;br /&gt;&lt;br /&gt;	for (i = 0; i &lt; n; ++i)&lt;br /&gt;		printf("to %d\t", i + 1);&lt;br /&gt;	printf("\n");&lt;br /&gt;&lt;br /&gt;	for (i = 0; i &lt; n; ++i)&lt;br /&gt;		printf("%d\t", d[i]);&lt;br /&gt;&lt;br /&gt;	printf("\n\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void bellman_ford(int s) {&lt;br /&gt;	int i, j;&lt;br /&gt;&lt;br /&gt;	for (i = 0; i &lt; n; ++i)&lt;br /&gt;		d[i] = INFINITY;&lt;br /&gt;&lt;br /&gt;	d[s] = 0;&lt;br /&gt;&lt;br /&gt;	for (i = 0; i &lt; n - 1; ++i)&lt;br /&gt;		for (j = 0; j &lt; e; ++j)&lt;br /&gt;			if (d[edges[j].u] + edges[j].w &lt; d[edges[j].v])&lt;br /&gt;				d[edges[j].v] = d[edges[j].u] + edges[j].w;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt;	int i, j;&lt;br /&gt;	int w;&lt;br /&gt;&lt;br /&gt;	FILE *fin = fopen("dist.txt", "r");&lt;br /&gt;	fscanf(fin, "%d", &amp;n);&lt;br /&gt;	e = 0;&lt;br /&gt;&lt;br /&gt;	for (i = 0; i &lt; n; ++i)&lt;br /&gt;		for (j = 0; j &lt; n; ++j) {&lt;br /&gt;			fscanf(fin, "%d", &amp;w);&lt;br /&gt;			if (w != 0) {&lt;br /&gt;				edges[e].u = i;&lt;br /&gt;				edges[e].v = j;&lt;br /&gt;				edges[e].w = w;&lt;br /&gt;				++e;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	fclose(fin);&lt;br /&gt;&lt;br /&gt;	/* printDist(); */&lt;br /&gt;&lt;br /&gt;	bellman_ford(0);&lt;br /&gt;&lt;br /&gt;	printDist();&lt;br /&gt;&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 29 Nov 2007 14:55:34 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4828</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>All Sources Shortest Path: The Floyd-Warshall Algorithm</title>
      <link>http://snippets.dzone.com/posts/show/4759</link>
      <description>This is a straightforward implementation of the &lt;a href="http://en.wikipedia.org/wiki/Floyd-Warshall_algorithm"&gt;Floyd-Warshall algorithm&lt;/a&gt; for finding the shortest path between all nodes of a graph.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A more detailed explanation is given &lt;a href="http://compprog.wordpress.com/2007/11/15/all-sources-shortest-path-the-floyd-warshall-algorithm/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;int n; /* Then number of nodes */&lt;br /&gt;int dist[16][16]; /* dist[i][j] is the length of the edge between i and j if&lt;br /&gt;			it exists, or 0 if it does not */&lt;br /&gt;&lt;br /&gt;void printDist() {&lt;br /&gt;	int i, j;&lt;br /&gt;	printf("    ");&lt;br /&gt;	for (i = 0; i &lt; n; ++i)&lt;br /&gt;		printf("%4c", 'A' + i);&lt;br /&gt;	printf("\n");&lt;br /&gt;	for (i = 0; i &lt; n; ++i) {&lt;br /&gt;		printf("%4c", 'A' + i);&lt;br /&gt;		for (j = 0; j &lt; n; ++j)&lt;br /&gt;			printf("%4d", dist[i][j]);&lt;br /&gt;		printf("\n");&lt;br /&gt;	}&lt;br /&gt;	printf("\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;	floyd_warshall()&lt;br /&gt;&lt;br /&gt;	after calling this function dist[i][j] will the the minimum distance&lt;br /&gt;	between i and j if it exists (i.e. if there's a path between i and j)&lt;br /&gt;	or 0, otherwise&lt;br /&gt;*/&lt;br /&gt;void floyd_warshall() {&lt;br /&gt;	int i, j, k;&lt;br /&gt;	for (k = 0; k &lt; n; ++k) {&lt;br /&gt;		printDist();&lt;br /&gt;		for (i = 0; i &lt; n; ++i)&lt;br /&gt;			for (j = 0; j &lt; n; ++j)&lt;br /&gt;				/* If i and j are different nodes and if &lt;br /&gt;					the paths between i and k and between&lt;br /&gt;					k and j exist, do */&lt;br /&gt;				if ((dist[i][k] * dist[k][j] != 0) &amp;&amp; (i != j))&lt;br /&gt;					/* See if you can't get a shorter path&lt;br /&gt;						between i and j by interspacing&lt;br /&gt;						k somewhere along the current&lt;br /&gt;						path */&lt;br /&gt;					if ((dist[i][k] + dist[k][j] &lt; dist[i][j]) ||&lt;br /&gt;						(dist[i][j] == 0))&lt;br /&gt;						dist[i][j] = dist[i][k] + dist[k][j];&lt;br /&gt;	}&lt;br /&gt;	printDist();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt;	FILE *fin = fopen("dist.txt", "r");&lt;br /&gt;	fscanf(fin, "%d", &amp;n);&lt;br /&gt;	int i, j;&lt;br /&gt;	for (i = 0; i &lt; n; ++i)&lt;br /&gt;		for (j = 0; j &lt; n; ++j)&lt;br /&gt;			fscanf(fin, "%d", &amp;dist[i][j]);&lt;br /&gt;	fclose(fin);&lt;br /&gt;&lt;br /&gt;	floyd_warshall();&lt;br /&gt;&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 15 Nov 2007 16:19:25 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4759</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>Prim's Algorithm for Finding Minimum Spanning Trees in C</title>
      <link>http://snippets.dzone.com/posts/show/4743</link>
      <description>The is a straight-forward implementation of Prim's Algorithm for finding the minimum spanning tree of a graph.&lt;br /&gt;&lt;br /&gt;A detailed explanation is given &lt;a href="http://compprog.wordpress.com/2007/11/09/minimal-spanning-trees-prims-algorithm/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;	The input file (weight.txt) look something like this&lt;br /&gt;		4&lt;br /&gt;		0 0 0 21&lt;br /&gt;		0 0 8 17&lt;br /&gt;		0 8 0 16&lt;br /&gt;		21 17 16 0&lt;br /&gt;&lt;br /&gt;	The first line contains n, the number of nodes.&lt;br /&gt;	Next is an nxn matrix containg the distances between the nodes&lt;br /&gt;	NOTE: The distance between a node and itself should be 0&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;int n; /* The number of nodes in the graph */&lt;br /&gt;&lt;br /&gt;int weight[100][100]; /* weight[i][j] is the distance between node i and node j;&lt;br /&gt;			if there is no path between i and j, weight[i][j] should&lt;br /&gt;			be 0 */&lt;br /&gt;&lt;br /&gt;char inTree[100]; /* inTree[i] is 1 if the node i is already in the minimum&lt;br /&gt;			spanning tree; 0 otherwise*/&lt;br /&gt;&lt;br /&gt;int d[100]; /* d[i] is the distance between node i and the minimum spanning&lt;br /&gt;		tree; this is initially infinity (100000); if i is already in&lt;br /&gt;		the tree, then d[i] is undefined;&lt;br /&gt;		this is just a temporary variable. It's not necessary but speeds&lt;br /&gt;		up execution considerably (by a factor of n) */&lt;br /&gt;&lt;br /&gt;int whoTo[100]; /* whoTo[i] holds the index of the node i would have to be&lt;br /&gt;			linked to in order to get a distance of d[i] */&lt;br /&gt;&lt;br /&gt;/* updateDistances(int target)&lt;br /&gt;	should be called immediately after target is added to the tree;&lt;br /&gt;	updates d so that the values are correct (goes through target's&lt;br /&gt;	neighbours making sure that the distances between them and the tree&lt;br /&gt;	are indeed minimum)&lt;br /&gt;*/&lt;br /&gt;void updateDistances(int target) {&lt;br /&gt;	int i;&lt;br /&gt;	for (i = 0; i &lt; n; ++i)&lt;br /&gt;		if ((weight[target][i] != 0) &amp;&amp; (d[i] &gt; weight[target][i])) {&lt;br /&gt;			d[i] = weight[target][i];&lt;br /&gt;			whoTo[i] = target;&lt;br /&gt;		}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt;	FILE *f = fopen("dist.txt", "r");&lt;br /&gt;	fscanf(f, "%d", &amp;n);&lt;br /&gt;	int i, j;&lt;br /&gt;	for (i = 0; i &lt; n; ++i)&lt;br /&gt;		for (j = 0; j &lt; n; ++j)&lt;br /&gt;			fscanf(f, "%d", &amp;weight[i][j]);&lt;br /&gt;	fclose(f);&lt;br /&gt;&lt;br /&gt;	/* Initialise d with infinity */&lt;br /&gt;	for (i = 0; i &lt; n; ++i)&lt;br /&gt;		d[i] = 100000;&lt;br /&gt;&lt;br /&gt;	/* Mark all nodes as NOT beeing in the minimum spanning tree */&lt;br /&gt;	for (i = 0; i &lt; n; ++i)&lt;br /&gt;		inTree[i] = 0;&lt;br /&gt;&lt;br /&gt;	/* Add the first node to the tree */&lt;br /&gt;	printf("Adding node %c\n", 0 + 'A');&lt;br /&gt;	inTree[0] = 1;&lt;br /&gt;	updateDistances(0);&lt;br /&gt;&lt;br /&gt;	int total = 0;&lt;br /&gt;	int treeSize;&lt;br /&gt;	for (treeSize = 1; treeSize &lt; n; ++treeSize) {&lt;br /&gt;		/* Find the node with the smallest distance to the tree */&lt;br /&gt;		int min = -1;&lt;br /&gt;		for (i = 0; i &lt; n; ++i)&lt;br /&gt;			if (!inTree[i])&lt;br /&gt;				if ((min == -1) || (d[min] &gt; d[i]))&lt;br /&gt;					min = i;&lt;br /&gt;&lt;br /&gt;		/* And add it */&lt;br /&gt;		printf("Adding edge %c-%c\n", whoTo[min] + 'A', min + 'A');&lt;br /&gt;		inTree[min] = 1;&lt;br /&gt;		total += d[min];&lt;br /&gt;&lt;br /&gt;		updateDistances(min);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	printf("Total distance: %d\n", total);&lt;br /&gt;&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 09 Nov 2007 12:31:11 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4743</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>Geni2gedcom</title>
      <link>http://snippets.dzone.com/posts/show/4081</link>
      <description>Tansform gedcom-XML output of geni.com to dot file for graphviz&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;?xml version='1.0' ?&gt;&lt;br /&gt;&lt;xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'&gt;&lt;br /&gt;&lt;xsl:output method='text'/&gt;&lt;br /&gt;&lt;br /&gt;&lt;xsl:template match="GEDCOM"&gt;&lt;br /&gt;        digraph &amp;apos;G&amp;apos; {&lt;br /&gt;        &lt;xsl:apply-templates select="FamilyRec"/&gt;&lt;br /&gt;        &lt;xsl:apply-templates select="IndividualRec"/&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;/xsl:template&gt;&lt;br /&gt;&lt;br /&gt;&lt;xsl:template match="IndividualRec"&gt;&lt;br /&gt;        &lt;xsl:value-of select="@Id"/&gt;[ label=&amp;quot;&lt;xsl:value-of select="IndivNam&lt;br /&gt;e/GivenName"/&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;&lt;xsl:value-of select="IndivName/SurName"/&gt; &amp;&lt;br /&gt;quot;];&lt;br /&gt;&lt;/xsl:template&gt;&lt;br /&gt;&lt;br /&gt;&lt;xsl:template match="FamilyRec"&gt;&lt;br /&gt;        &lt;xsl:variable name="famId"&gt;&lt;xsl:value-of select="@Id"/&gt;&lt;/xsl:variable&gt;&lt;br /&gt;        &lt;xsl:if test="HusbFath"&gt;&lt;br /&gt;                &lt;xsl:value-of select="HusbFath/Link/@Ref"/&gt;-&amp;gt;&lt;xsl:value-of se&lt;br /&gt;lect="$famId"/&gt;;&lt;br /&gt;        &lt;/xsl:if&gt;&lt;br /&gt;&lt;br /&gt;        &lt;xsl:if test="WifeMoth"&gt;&lt;br /&gt;                &lt;xsl:value-of select="WifeMoth/Link/@Ref"/&gt;-&amp;gt;&lt;xsl:value-of se&lt;br /&gt;lect="$famId"/&gt;;&lt;br /&gt;        &lt;/xsl:if&gt;&lt;br /&gt;&lt;br /&gt;        &lt;xsl:for-each select="Child"&gt;&lt;br /&gt;                &lt;xsl:value-of select="$famId"/&gt;-&amp;gt;&lt;xsl:value-of select="Link/@&lt;br /&gt;Ref"/&gt;;&lt;br /&gt;        &lt;/xsl:for-each&gt;&lt;br /&gt;&lt;br /&gt;&lt;/xsl:template&gt;&lt;br /&gt;&lt;br /&gt;&lt;/xsl:stylesheet&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 31 May 2007 08:22:10 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4081</guid>
      <author>lindenb (Pierre)</author>
    </item>
    <item>
      <title>graham scan</title>
      <link>http://snippets.dzone.com/posts/show/2838</link>
      <description>// graham scan incomplete&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.BufferedWriter;&lt;br /&gt;import java.io.FileReader;&lt;br /&gt;import java.io.FileWriter;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.PrintWriter;&lt;br /&gt;import java.util.Arrays;&lt;br /&gt;import java.util.StringTokenizer;&lt;br /&gt;import java.util.Stack;&lt;br /&gt;/*&lt;br /&gt;ID: kanishk1&lt;br /&gt;LANG: JAVA&lt;br /&gt;TASK: moat&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;public class moat {&lt;br /&gt;	static class Point implements Comparable {&lt;br /&gt;		public int x; public int y;&lt;br /&gt;		Point pv;&lt;br /&gt;		public Point(int x, int y) {&lt;br /&gt;			this.x = x;&lt;br /&gt;			this.y = y;&lt;br /&gt;		}&lt;br /&gt;		public void setPivot(Point pv) {&lt;br /&gt;			this.pv = pv;&lt;br /&gt;		}&lt;br /&gt;		public int compareTo(Object o) {&lt;br /&gt;			Point p = (Point)o;&lt;br /&gt;			double a1 = ((y-pv.y)*1.0)/(x-pv.x);&lt;br /&gt;			if(a1&lt;0) a1 = 2+a1;&lt;br /&gt;			double a2 = ((p.y-pv.y)*1.0)/(p.x-pv.x);&lt;br /&gt;			if(a2&lt;0) a2 = 2+a2;&lt;br /&gt;			if(a1&gt;a2) return 1;&lt;br /&gt;			else if(a1&lt;a2) return -1;&lt;br /&gt;			else return y-p.y;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	static Point []points;&lt;br /&gt;	 public static void main (String [] args) throws IOException {&lt;br /&gt;		    &lt;br /&gt;		 // Use BufferedReader rather than RandomAccessFile; it's much faster&lt;br /&gt;		    BufferedReader f = new BufferedReader(new FileReader("moat.in"));&lt;br /&gt;		                                                  // input file name goes above&lt;br /&gt;		    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("moat.out")));&lt;br /&gt;&lt;br /&gt;		    int N = Integer.parseInt(f.readLine());&lt;br /&gt;		    points = new Point[N];&lt;br /&gt;		    int lx = Integer.MAX_VALUE, ly = Integer.MAX_VALUE;&lt;br /&gt;		    Point p = null;&lt;br /&gt;		    for(int i=0; i&lt;N; i++) {&lt;br /&gt;		    	StringTokenizer st = new StringTokenizer(f.readLine());&lt;br /&gt;		    	int x = Integer.parseInt(st.nextToken());&lt;br /&gt;		    	int y = Integer.parseInt(st.nextToken());&lt;br /&gt;		    	&lt;br /&gt;		    	points[i] = new Point(x,y);&lt;br /&gt;		    	if(y&lt;ly) {&lt;br /&gt;		    		ly =y;&lt;br /&gt;		    		lx = x;&lt;br /&gt;		    		p = points[i];&lt;br /&gt;		    	}&lt;br /&gt;		    	else if(y==ly &amp;&amp; x&lt;lx) {&lt;br /&gt;		    		lx = x;&lt;br /&gt;		    		p = points[i];&lt;br /&gt;		    	}&lt;br /&gt;		    }&lt;br /&gt;		    for(int i=0; i&lt;N; i++) {&lt;br /&gt;		    	points[i].setPivot(p);&lt;br /&gt;		    }&lt;br /&gt;		    Arrays.sort(points);&lt;br /&gt;		    for(int i=0; i&lt;points.length; i++)&lt;br /&gt;		    {&lt;br /&gt;		    	System.out.println(points[i].x+" "+points[i].y);&lt;br /&gt;		    }&lt;br /&gt;		    Stack stack = new Stack();&lt;br /&gt;		    stack.push(points[0]);&lt;br /&gt;		    stack.push(points[1]);&lt;br /&gt;		    for(int i=2; i&lt;points.length; i++) {&lt;br /&gt;		    	Point top = (Point)stack.pop();&lt;br /&gt;		    	Point second = (Point)stack.pop();&lt;br /&gt;		        int o = Cross_product(second, top, points[i]);&lt;br /&gt;		        stack.push(second);&lt;br /&gt;		        stack.push(top);&lt;br /&gt;		        if(o == 0) {&lt;br /&gt;		        	stack.pop();&lt;br /&gt;		        	stack.push(points[i]);&lt;br /&gt;		        }&lt;br /&gt;		        else if (o &gt; 0) {&lt;br /&gt;		        	stack.push(points[i]);&lt;br /&gt;		        }&lt;br /&gt;		        else {&lt;br /&gt;		                while (o &lt;= 0 &amp;&amp; stack.size() &gt; 2) {&lt;br /&gt;		                        stack.pop();&lt;br /&gt;		                        top = (Point)stack.pop();&lt;br /&gt;		        		    	second = (Point)stack.pop();&lt;br /&gt;		                        o = Cross_product(second, top, points[i]);&lt;br /&gt;		                        stack.push(second);&lt;br /&gt;		        		        stack.push(top);&lt;br /&gt;		                }&lt;br /&gt;		                stack.push(points[i]);&lt;br /&gt;		        }&lt;br /&gt;		    }&lt;br /&gt;		    System.out.println("Done");&lt;br /&gt;			while(stack.size()&gt;0) {&lt;br /&gt;				Point pp = (Point)stack.pop();&lt;br /&gt;				System.out.println(pp.x+" "+pp.y);&lt;br /&gt;			}&lt;br /&gt;		    //out.println(ans);                        &lt;br /&gt;		    out.close();                                 &lt;br /&gt;		    System.exit(0); &lt;br /&gt;	 }&lt;br /&gt;	 &lt;br /&gt;	 private static int Cross_product(Point p1, Point p2, Point p3) {&lt;br /&gt;		 return (p2.x - p1.x)*(p3.y - p1.y) - (p3.x - p1.x)*(p2.y - p1.y);	&lt;br /&gt;	 }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 16 Oct 2006 00:52:36 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2838</guid>
      <author>kanishkkunal (Kanishk Kunal)</author>
    </item>
    <item>
      <title>graph traversal</title>
      <link>http://snippets.dzone.com/posts/show/2837</link>
      <description>// Graph traversal&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.BufferedWriter;&lt;br /&gt;import java.io.FileReader;&lt;br /&gt;import java.io.FileWriter;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.PrintWriter;&lt;br /&gt;import java.util.StringTokenizer;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;ID: kanishk1&lt;br /&gt;LANG: JAVA&lt;br /&gt;TASK: skate&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;import java.util.*;&lt;br /&gt;import java.io.*;&lt;br /&gt;&lt;br /&gt;public class skate {&lt;br /&gt;	 static char [][]arr;&lt;br /&gt;	 static ArrayList list = new ArrayList();&lt;br /&gt;	 static PrintWriter out;&lt;br /&gt;	 public static void main (String [] args) throws IOException {&lt;br /&gt;	    // Use BufferedReader rather than RandomAccessFile; it's much faster&lt;br /&gt;	    BufferedReader f = new BufferedReader(new FileReader("skate.in"));&lt;br /&gt;	                                                  // input file name goes above&lt;br /&gt;	    out = new PrintWriter(new BufferedWriter(new FileWriter("skate.out")));&lt;br /&gt;	    // Use StringTokenizer vs. readLine/split -- lots faster&lt;br /&gt;	    StringTokenizer st = new StringTokenizer(f.readLine());&lt;br /&gt;	    int R = Integer.parseInt(st.nextToken());   &lt;br /&gt;	    int C = Integer.parseInt(st.nextToken());   &lt;br /&gt;	    //System.out.println(R+" "+C);&lt;br /&gt;	    arr = new char[R][C];&lt;br /&gt;	    for(int i=0; i&lt;R; i++) {&lt;br /&gt;	    	arr[i] = f.readLine().trim().toCharArray();&lt;br /&gt;	    }&lt;br /&gt;	    list.add(pair(0,0));&lt;br /&gt;	    doTask(0, 0);&lt;br /&gt;	  }		  &lt;br /&gt;	 &lt;br /&gt;	 private static void doTask(int i, int j) {&lt;br /&gt;		 //System.out.println(pair(i,j));&lt;br /&gt;		 if(i==arr.length-1 &amp;&amp; j==arr[0].length-1) {&lt;br /&gt;			 //System.out.println("here"); &lt;br /&gt;			 out.println(printAnswer(list));                        &lt;br /&gt;			 out.close();                                 &lt;br /&gt;			 System.exit(0); &lt;br /&gt;		 }&lt;br /&gt;		 if(isValid(i+1, j)) {&lt;br /&gt;			 list.add(pair(i+1,j));&lt;br /&gt;			 arr[i+1][j] = '@';&lt;br /&gt;			 doTask(i+1,j);&lt;br /&gt;			 arr[i+1][j] = '.';&lt;br /&gt;			 list.remove(pair(i+1,j));&lt;br /&gt;		 }&lt;br /&gt;		 if(isValid(i-1, j)) {&lt;br /&gt;			 list.add(pair(i-1,j));&lt;br /&gt;			 arr[i-1][j] = '@';&lt;br /&gt;			 doTask(i-1,j);&lt;br /&gt;			 arr[i-1][j] = '.';&lt;br /&gt;			 list.remove(pair(i-1,j));&lt;br /&gt;		 }&lt;br /&gt;		 if(isValid(i, j+1)) {&lt;br /&gt;			 arr[i][j+1] = '@';&lt;br /&gt;			 list.add(pair(i,j+1));&lt;br /&gt;			 doTask(i,j+1);&lt;br /&gt;			 arr[i][j+1] = '.';&lt;br /&gt;			 list.remove(pair(i,j+1));&lt;br /&gt;		 }&lt;br /&gt;		 if(isValid(i, j-1)) {&lt;br /&gt;			 arr[i][j-1] = '@';&lt;br /&gt;			 list.add(pair(i,j-1));&lt;br /&gt;			 doTask(i,j-1);&lt;br /&gt;			 arr[i][j-1] = '.';&lt;br /&gt;			 list.remove(pair(i,j-1));&lt;br /&gt;		 }&lt;br /&gt;		 return;&lt;br /&gt;	 }&lt;br /&gt;	 &lt;br /&gt;	 private static boolean isValid(int i, int j) {&lt;br /&gt;		 if(i&lt;0 || j&lt;0 || i&gt;=arr.length || j&gt;=arr[0].length) return false;&lt;br /&gt;		 if(arr[i][j]!='.') return false;&lt;br /&gt;		 return true;&lt;br /&gt;	 }&lt;br /&gt;	 &lt;br /&gt;	 private static String pair(int i, int j) {&lt;br /&gt;		 return (i+1)+" "+(j+1);&lt;br /&gt;	 }&lt;br /&gt;	 &lt;br /&gt;	 private static String printAnswer(ArrayList list) {&lt;br /&gt;		 String ans = "";&lt;br /&gt;		 for(int i=0; i&lt;list.size(); i++) {&lt;br /&gt;			 ans+=list.get(i);&lt;br /&gt;			 if(i!=list.size()-1) ans+="\n";&lt;br /&gt;		 }&lt;br /&gt;		 return ans;&lt;br /&gt;	 }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 16 Oct 2006 00:50:52 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2837</guid>
      <author>kanishkkunal (Kanishk Kunal)</author>
    </item>
    <item>
      <title>Grafos en 3d</title>
      <link>http://snippets.dzone.com/posts/show/2664</link>
      <description>Implementacion con opengl de la visualizacion de grafos, donde los vertices son resortes uniendo los nodos, y los nodos se rechazan entre ellos, y existe una fuerza en el origen que los acerca a todos.&lt;br /&gt;&lt;br /&gt;Makefile para compilarlo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;INCLUDE = -I/usr/include/ &lt;br /&gt;LIBDIR  = -L/usr/X11R6/lib&lt;br /&gt;&lt;br /&gt;CC = gcc&lt;br /&gt;CCFLAGS = -g ${INCLUDE}&lt;br /&gt;LIBRARY = -lX11 -lXi -lXmu -lglut -lGL -lGLU -lm&lt;br /&gt;&lt;br /&gt;all :ejemplo1.o&lt;br /&gt;	${CC} ${CCFLAGS} -o ejemplo1 ejemplo1.o ${LIBDIR} ${LIBRARY}&lt;br /&gt;&lt;br /&gt;clean :&lt;br /&gt;	rm -rf ejemplo1 ejemplo1.o&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;GL/gl.h&gt;&lt;br /&gt;#include &lt;GL/glut.h&gt;&lt;br /&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;math.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;&lt;br /&gt;#define MAXNODOS 100&lt;br /&gt;&lt;br /&gt;typedef struct _point{&lt;br /&gt;	float x,y,z;&lt;br /&gt;} point;&lt;br /&gt;&lt;br /&gt;typedef struct _force{&lt;br /&gt;	float fx,fy,fz;&lt;br /&gt;} force;&lt;br /&gt;&lt;br /&gt;typedef struct _sisi{&lt;br /&gt;	point p;&lt;br /&gt;	force f;&lt;br /&gt;} sisi;&lt;br /&gt;&lt;br /&gt;typedef struct _grafo{&lt;br /&gt;	int nnodos;&lt;br /&gt;	sisi nodos[100];&lt;br /&gt;	int enlaces[100][100];&lt;br /&gt;	point max,min;	&lt;br /&gt;} grafo;&lt;br /&gt;&lt;br /&gt;float angulo=0.0;&lt;br /&gt;grafo grafo_global;&lt;br /&gt;&lt;br /&gt;void calcularfuerzas(grafo *g){&lt;br /&gt;	int i,j;&lt;br /&gt;	float distancia;&lt;br /&gt;	for (i=0;i&lt;g-&gt;nnodos;i++){&lt;br /&gt;		g-&gt;nodos[i].f.fx = 0.0f;&lt;br /&gt;		g-&gt;nodos[i].f.fy = 0.0f;&lt;br /&gt;		g-&gt;nodos[i].f.fz = 0.0f;&lt;br /&gt;		&lt;br /&gt;		for (j=0;j&lt;g-&gt;nnodos;j++){&lt;br /&gt;			if (i!=j &amp;&amp; g-&gt;enlaces[i][j]==1){&lt;br /&gt;				distancia = sqrt(powf(g-&gt;nodos[i].p.x - g-&gt;nodos[j].p.x,2.0f) + powf(g-&gt;nodos[i].p.y - g-&gt;nodos[j].p.y,2.0f) + powf(g-&gt;nodos[i].p.z - g-&gt;nodos[j].p.z,2.0f));&lt;br /&gt;				if ( distancia &gt; 0.001f ){&lt;br /&gt;					g-&gt;nodos[i].f.fx += (g-&gt;nodos[i].p.x - g-&gt;nodos[j].p.x) / powf(distancia,3.0f);&lt;br /&gt;					g-&gt;nodos[i].f.fy += (g-&gt;nodos[i].p.y - g-&gt;nodos[j].p.y) / powf(distancia,3.0f);&lt;br /&gt;					g-&gt;nodos[i].f.fz += (g-&gt;nodos[i].p.z - g-&gt;nodos[j].p.z) / powf(distancia,3.0f);&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;//		Nene&lt;br /&gt;&lt;br /&gt;		distancia = sqrt(powf(g-&gt;nodos[i].p.x,2.0f)+powf(g-&gt;nodos[i].p.y,2.0f)+powf(g-&gt;nodos[i].p.z,2.0f));&lt;br /&gt;&lt;br /&gt;		if (distancia&gt;(float)g-&gt;nnodos){&lt;br /&gt;			g-&gt;nodos[i].f.fx -= g-&gt;nnodos*g-&gt;nodos[i].p.x/powf(distancia,3.0f);&lt;br /&gt;			g-&gt;nodos[i].f.fy -= g-&gt;nnodos*g-&gt;nodos[i].p.y/powf(distancia,3.0f);&lt;br /&gt;			g-&gt;nodos[i].f.fz -= g-&gt;nnodos*g-&gt;nodos[i].p.z/powf(distancia,3.0f);				&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	grafo_global.max.x=-1000;&lt;br /&gt;	grafo_global.max.y=-1000;&lt;br /&gt;	grafo_global.max.z=-1000;&lt;br /&gt;	grafo_global.min.x=1000;&lt;br /&gt;	grafo_global.min.y=1000;&lt;br /&gt;	grafo_global.min.z=1000;		&lt;br /&gt;&lt;br /&gt;	for (i=0;i&lt;g-&gt;nnodos;i++){	&lt;br /&gt;//		Movimiento&lt;br /&gt;		g-&gt;nodos[i].p.x+=g-&gt;nodos[i].f.fx;&lt;br /&gt;		g-&gt;nodos[i].p.y+=g-&gt;nodos[i].f.fy;&lt;br /&gt;		g-&gt;nodos[i].p.z+=g-&gt;nodos[i].f.fz;		&lt;br /&gt;&lt;br /&gt;		if (grafo_global.max.x&lt;grafo_global.nodos[i].p.x)&lt;br /&gt;			grafo_global.max.x=grafo_global.nodos[i].p.x;	&lt;br /&gt;&lt;br /&gt;		if (grafo_global.max.y&lt;grafo_global.nodos[i].p.y)&lt;br /&gt;			grafo_global.max.y=grafo_global.nodos[i].p.y;	&lt;br /&gt;&lt;br /&gt;		if (grafo_global.max.z&lt;grafo_global.nodos[i].p.z)&lt;br /&gt;			grafo_global.max.z=grafo_global.nodos[i].p.z;	&lt;br /&gt;&lt;br /&gt;		if (grafo_global.min.x&gt;grafo_global.nodos[i].p.x)&lt;br /&gt;			grafo_global.min.x=grafo_global.nodos[i].p.x;	&lt;br /&gt;&lt;br /&gt;		if (grafo_global.min.y&gt;grafo_global.nodos[i].p.y)&lt;br /&gt;			grafo_global.min.y=grafo_global.nodos[i].p.y;	&lt;br /&gt;&lt;br /&gt;		if (grafo_global.min.z&gt;grafo_global.nodos[i].p.z)&lt;br /&gt;			grafo_global.min.z=grafo_global.nodos[i].p.z;	&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void init_grafo(void){&lt;br /&gt;	int i,j;&lt;br /&gt;	grafo_global.nnodos=30;&lt;br /&gt;&lt;br /&gt;	for (i=0;i&lt;grafo_global.nnodos;i++){&lt;br /&gt;		for (j=0;j&lt;grafo_global.nnodos;j++){&lt;br /&gt;			grafo_global.enlaces[i][j]=1;&lt;br /&gt;		}&lt;br /&gt;		grafo_global.nodos[i].p.x=rand()%10;&lt;br /&gt;		grafo_global.nodos[i].p.y=rand()%10;&lt;br /&gt;		grafo_global.nodos[i].p.z=rand()%10;&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;//	grafo_global.enlaces[0][1]=0;&lt;br /&gt;//	grafo_global.enlaces[1][0]=0;&lt;br /&gt;&lt;br /&gt;	grafo_global.nodos[0].p.x=5;&lt;br /&gt;	grafo_global.nodos[0].p.y=1;&lt;br /&gt;	grafo_global.nodos[0].p.z=5;		&lt;br /&gt;&lt;br /&gt;	grafo_global.nodos[1].p.x=2;&lt;br /&gt;	grafo_global.nodos[1].p.y=2;&lt;br /&gt;	grafo_global.nodos[1].p.z=2;		&lt;br /&gt;&lt;br /&gt;	grafo_global.nodos[2].p.x=2;&lt;br /&gt;	grafo_global.nodos[2].p.y=2;&lt;br /&gt;	grafo_global.nodos[2].p.z=3;		&lt;br /&gt;&lt;br /&gt;	grafo_global.nodos[3].p.x=3;&lt;br /&gt;	grafo_global.nodos[3].p.y=6;&lt;br /&gt;	grafo_global.nodos[3].p.z=6;		&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	grafo_global.nodos[4].p.x=5;&lt;br /&gt;	grafo_global.nodos[4].p.y=-5;&lt;br /&gt;	grafo_global.nodos[4].p.z=5;		&lt;br /&gt;&lt;br /&gt;	grafo_global.nodos[5].p.x=-2;&lt;br /&gt;	grafo_global.nodos[5].p.y=2;&lt;br /&gt;	grafo_global.nodos[5].p.z=2;		&lt;br /&gt;&lt;br /&gt;	grafo_global.nodos[6].p.x=2;&lt;br /&gt;	grafo_global.nodos[6].p.y=2;&lt;br /&gt;	grafo_global.nodos[6].p.z=-3;		&lt;br /&gt;&lt;br /&gt;	grafo_global.nodos[7].p.x=3;&lt;br /&gt;	grafo_global.nodos[7].p.y=8;&lt;br /&gt;	grafo_global.nodos[7].p.z=6;		&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	grafo_global.max.x=grafo_global.nodos[0].p.x;&lt;br /&gt;	grafo_global.max.y=grafo_global.nodos[0].p.y;&lt;br /&gt;	grafo_global.max.z=grafo_global.nodos[0].p.z;&lt;br /&gt;	grafo_global.min.x=grafo_global.nodos[0].p.x;&lt;br /&gt;	grafo_global.min.y=grafo_global.nodos[0].p.y;&lt;br /&gt;	grafo_global.min.z=grafo_global.nodos[0].p.z;		&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void init(void) &lt;br /&gt;{&lt;br /&gt;   glClearColor (1.0, 1.0, 1.0, 0.0);&lt;br /&gt;   glShadeModel (GL_FLAT);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void display(void)&lt;br /&gt;{&lt;br /&gt;   glClear (GL_COLOR_BUFFER_BIT);&lt;br /&gt;   glColor3f (0, 0, 0);&lt;br /&gt;   glLoadIdentity();&lt;br /&gt;   gluLookAt (0.0, 0.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);&lt;br /&gt;   glRotatef(angulo,0,1.0,0);&lt;br /&gt;&lt;br /&gt;	float dx,dy,dz;&lt;br /&gt;	&lt;br /&gt;	dx = grafo_global.max.x - grafo_global.min.x;&lt;br /&gt;	dy = grafo_global.max.y - grafo_global.min.y;&lt;br /&gt;	dz = grafo_global.max.z - grafo_global.min.z;	&lt;br /&gt;	&lt;br /&gt;//   glutWireCube (1.0);&lt;br /&gt;//   glScalef (10.0/dx, 10.0/dy, 10.0/dz);&lt;br /&gt;	if (dx&gt;dy &amp;&amp; dx &gt;dz){&lt;br /&gt;&lt;br /&gt;		glScalef(10.0/dx,10.0/dx,10.0/dx);&lt;br /&gt;		glutWireCube (dx);&lt;br /&gt;//	glTranslatef(dx/2.0f,dx/2.0f,dx/2.0f);&lt;br /&gt;	} else if (dy&gt;dx &amp;&amp; dy &gt;dz){&lt;br /&gt;&lt;br /&gt;		glScalef(10.0/dy,10.0/dy,10.0/dy);&lt;br /&gt;		glutWireCube (dy);&lt;br /&gt;//			glTranslatef(dy/2.0f,dy/2.0f,dy/2.0f);&lt;br /&gt;	} else if (dz&gt;dx &amp;&amp; dz &gt;dy){&lt;br /&gt;&lt;br /&gt;		glScalef(10.0/dz,10.0/dz,10.0/dz);		&lt;br /&gt;		glutWireCube (dz);&lt;br /&gt;//			glTranslatef(dz/2.0f,dz/2.0f,dz/2.0f);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;	int cont,cont2;&lt;br /&gt;	for (cont=0;cont&lt;grafo_global.nnodos;cont++){&lt;br /&gt;		glPushMatrix();&lt;br /&gt;		glTranslatef(grafo_global.nodos[cont].p.x, grafo_global.nodos[cont].p.y, grafo_global.nodos[cont].p.z);&lt;br /&gt;		glutSolidSphere(.2, 32, 32);&lt;br /&gt;		glPopMatrix();&lt;br /&gt;		for (cont2=cont;cont2&lt;grafo_global.nnodos;cont2++){&lt;br /&gt;			if (grafo_global.enlaces[cont][cont2]){&lt;br /&gt;				glBegin(GL_LINES);&lt;br /&gt;				glVertex3f(grafo_global.nodos[cont].p.x,grafo_global.nodos[cont].p.y,grafo_global.nodos[cont].p.z);&lt;br /&gt;				glVertex3f(grafo_global.nodos[cont2].p.x,grafo_global.nodos[cont2].p.y,grafo_global.nodos[cont2].p.z);				&lt;br /&gt;				glEnd();				&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   glFlush ();&lt;br /&gt;   glutSwapBuffers();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void reshape(int w, int h)&lt;br /&gt;{&lt;br /&gt;   glViewport (0, 0, (GLsizei) w, (GLsizei) h); &lt;br /&gt;   glMatrixMode (GL_PROJECTION);&lt;br /&gt;   glLoadIdentity ();&lt;br /&gt;   glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 25.0);&lt;br /&gt;   glMatrixMode (GL_MODELVIEW); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void keyboard(unsigned char key, int x, int y)&lt;br /&gt;{&lt;br /&gt;   switch (key) {&lt;br /&gt;      case 27:&lt;br /&gt;         exit(0);&lt;br /&gt;         break;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void idle(void){&lt;br /&gt;&lt;br /&gt;	static int timelast=0;&lt;br /&gt;	int time;&lt;br /&gt;	time = glutGet(GLUT_ELAPSED_TIME);&lt;br /&gt;	if (time-timelast&gt;10){&lt;br /&gt;		timelast=time;&lt;br /&gt;	if (angulo&lt;360){&lt;br /&gt;		angulo+=0.1;&lt;br /&gt;	} else {&lt;br /&gt;		angulo=0.0;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	}&lt;br /&gt;	calcularfuerzas(&amp;grafo_global);&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;	glutPostRedisplay();	&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char** argv)&lt;br /&gt;{&lt;br /&gt;	&lt;br /&gt;	/*&lt;br /&gt;	 * Inicializando OpenGL&lt;br /&gt;	 * */&lt;br /&gt;   glutInit(&amp;argc, argv);&lt;br /&gt;   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);&lt;br /&gt;   glutInitWindowSize (500, 500); &lt;br /&gt;   glutInitWindowPosition (100, 100);&lt;br /&gt;   glutCreateWindow (argv[0]);&lt;br /&gt;   init ();&lt;br /&gt;   glutDisplayFunc(display); &lt;br /&gt;   glutReshapeFunc(reshape);&lt;br /&gt;   glutKeyboardFunc(keyboard);&lt;br /&gt;   glutIdleFunc(idle);&lt;br /&gt;&lt;br /&gt;   /*&lt;br /&gt;    * Inicializando Entrada del Grafo&lt;br /&gt;    * */&lt;br /&gt;   init_grafo();&lt;br /&gt;&lt;br /&gt;	/*&lt;br /&gt;	 * Entrando en el ciclo&lt;br /&gt;	 * */&lt;br /&gt;&lt;br /&gt;   glutMainLoop();&lt;br /&gt;   &lt;br /&gt;   return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 22 Sep 2006 20:30:02 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2664</guid>
      <author>jcongote (John Edgar Congote Calle)</author>
    </item>
  </channel>
</rss>
