read edges from stdin instead of argv

This commit is contained in:
josch 2013-04-11 10:19:32 +02:00
parent d6a0832864
commit fda66157da
2 changed files with 19 additions and 13 deletions

View file

@ -15,7 +15,7 @@ vertices. Three lines now contain a sorted() statement.
Usage
-----
python cycles.py 4 0,1 0,2 1,0 1,3 2,0 3,0 3,1 3,2
echo "0 1\n0 2\n1 0\n1 3\n2 0\n3 0\n3 1\n3 2" | python cycles.py 4
First argument is the number of vertices. Subsequent arguments are ordered
pairs of comma separated vertices that make up the directed edges of the
@ -25,15 +25,16 @@ DOT file input
--------------
For simplicity, there is no DOT file parser included but the following allows
to create a suitable argument string for simple DOT graphs.
to create a suitable argument string and standard input for simple DOT graphs.
Given a DOT file of a simple (no labels, colors, styles, only pairs of
vertices...) directed graph, the following line produces commandline
arguments in the above format for that graph.
vertices...) directed graph, the following lines generate the number of
vertices as well as the edge list expected on standard input.
echo `sed -n -e '/^\s*[0-9]\+;$/p' graph.dot | wc -l` `sed -n -e 's/^\s*\([0-9]\) -> \([0-9]\);$/\1,\2/p' graph.dot`
sed -n -e '/^\s*[0-9]\+;$/p' graph.dot | wc -l
sed -n -e 's/^\s*\([0-9]\) -> \([0-9]\);$/\1 \2/p' graph.dot
The above line works on DOT files like the following:
The above lines works on DOT files like the following:
digraph G {
0;
@ -46,6 +47,11 @@ The above line works on DOT files like the following:
2 -> 1;
}
It would produce the following output:
They would produce the following output:
3 0,1 0,2 1,0 2,0 2,1
3
0 1
0 2
1 0
2 0
2 1

View file

@ -12,8 +12,8 @@ import sys
import networkx as nx
from collections import defaultdict
if len(sys.argv) < 3:
print "usage: %s num_vertices [v1,v2...]"%(sys.argv[0])
if len(sys.argv) != 2:
print "usage: echo \"v1 v2\nv1 v3\n...\" | %s num_vertices"%(sys.argv[0])
def simple_cycles(G):
def _unblock(thisnode):
@ -73,9 +73,9 @@ def simple_cycles(G):
G = nx.DiGraph()
for edge in sys.argv[2:]:
v1,v2 = edge.split(',', 1)
G.add_edge(v1,v2)
for edge in sys.stdin.readlines():
v1,v2 = edge.split(' ', 1)
G.add_edge(v1.strip(),v2.strip())
for c in simple_cycles(G):
print " ".join(c[:-1])