]> granicus.if.org Git - graphviz/commitdiff
Add gvpr scripts for checking if a graph is bipartite, and converting a bipartite...
authorEmden Gansner <emdenrg@google.com>
Fri, 2 Oct 2015 20:46:22 +0000 (16:46 -0400)
committerEmden Gansner <emdenrg@google.com>
Fri, 2 Oct 2015 20:46:22 +0000 (16:46 -0400)
cmd/gvpr/lib/binduce [new file with mode: 0644]
cmd/gvpr/lib/bipart [new file with mode: 0644]

diff --git a/cmd/gvpr/lib/binduce b/cmd/gvpr/lib/binduce
new file mode 100644 (file)
index 0000000..9e987c3
--- /dev/null
@@ -0,0 +1,46 @@
+/* Given a bipartite graph, induce a non-bipartite graph.
+ * argv[0]="name=value" This is used to identify the nodes used
+ * to induce edges. If aget(n,name) == value, 
+ *  if deg(n) == 1, delete
+ *  if deg(n) == 2, delete and connect to neighbor with edge
+ *  if deg(n) > 2, delete and add edge between all pairs of neighbors
+ *  Add weights to edge.
+ */
+BEGIN{
+  int i, cnt;
+  int wt[edge_t];
+  string values[int];
+  node_t nbrs[int];
+  edge_t e;
+  tokens(ARGV[0],values,"=");
+  string aname = values[0];
+  string value = values[1];
+  printf(2, "%s=%s\n", aname, value);
+}
+N[aget($,aname)==value] {
+  if ($.degree > 1) {
+    cnt = 0;
+    for (e = fstedge($); e; e = nxtedge(e, $))
+      nbrs[cnt++] = opp(e,$);
+    for (i = 0; i < cnt-1; i++) {
+      if (e = isEdge(nbrs[i],nbrs[i+1],"")) {
+        wt[e] += 1;
+      }
+      else if ($G.directed && (e = isEdge(nbrs[i+1],nbrs[i],""))) {
+        wt[e] += 1;
+      }
+      else {
+        e = edge(nbrs[i],nbrs[i+1],"");
+        wt[e] = 1;
+      }
+    }
+    unset(nbrs);
+  }
+  delete($G,$);
+}
+END_G{
+  printf(2, "#nodes = %d\n", $.n_nodes);
+  for (wt[e]) {
+    e.weight = sprintf ("%d", wt[e]);
+  }
+}
diff --git a/cmd/gvpr/lib/bipart b/cmd/gvpr/lib/bipart
new file mode 100644 (file)
index 0000000..959f804
--- /dev/null
@@ -0,0 +1,27 @@
+/* Determine if a graph is bipartite or not.
+ */
+BEG_G{
+  int vc, c, color[node_t];
+  node_t v;
+  edge_t e;
+  $tvtype = TV_dfs;
+  $tvroot = fstnode($);
+}
+N{
+  if ($tvedge == NULL)
+    color[$] = 1;
+  if (color[$] == 1)
+    c = 2;
+  else
+    c = 1;
+  for (e = fstedge($); e; e = nxtedge(e,$)) {
+    v = opp(e,$);
+    vc = color[v];
+    if (vc == 0)
+      color[v] = c;
+    else if (vc != c) {
+      printf(2, "Not bipartite\n");
+      exit(1);
+    }
+  }
+}