depath 638 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. /* Replace paths a -> b -> ... -> c with a -> c */
  2. BEGIN {
  3. edge_t e;
  4. node_t n, prv, nxt;
  5. int to_delete[node_t];
  6. }
  7. N [(indegree == 1) && (outdegree == 1)] {
  8. e = fstin ($);
  9. prv = e.tail;
  10. e = fstout ($);
  11. nxt = e.head;
  12. to_delete[$] = 1;
  13. while ((prv.indegree == 1) && (prv.outdegree == 0)) {
  14. e = fstin (prv);
  15. n = e.tail;
  16. to_delete[prv] = 1;
  17. prv = n;
  18. }
  19. while ((nxt.indegree == 0) && (nxt.outdegree == 1)) {
  20. e = fstout (nxt);
  21. n = e.head;
  22. to_delete[nxt] = 1;
  23. nxt = n;
  24. }
  25. if (!isEdge (prv,nxt,""))
  26. edge (prv,nxt,"");
  27. }
  28. END_G {
  29. for (to_delete[n]) {
  30. delete($G, n);
  31. }
  32. }