Efficient Road Network
I find !! and once-used definitions smelly.

A passed around environment like roads might as well open a scope that spans all uses of it.

efficientRoadNetwork roads n = and
  [ edge i j || any (\k -&gt; edge i k &amp;&amp; edge k j) [0..n-1]
  | i &lt;- [0..n-1], j &lt;- [0..i-1]
  ] where edge i j = elem [i,j] roads || elem [j,i] roads