--- /dev/null
+/* 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]);
+ }
+}
--- /dev/null
+/* 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);
+ }
+ }
+}