We revisit a concept that has been central in some early stages of computer science, that of structured programming: a set of rules that an algorithm must follow in order to acquire a structure that is desirable in many aspects. While much has been written about structured programming, an important issue has been left unanswered: given an arbitrary, compiled program, describe an algorithm to decide whether or not it is structured, that is, whether it conforms to the stated principles of structured programming. We refer to the classical concept of structured programming, as described by Dijkstra. By employing a graph model and graph-theoretic techniques, we formulate an efficient algorithm for answering this question. To do so, we first introduce the class of graphs which correspond to structured programs, which we call Dijkstra Graphs. Our problem then becomes the recognition of such graphs, for which we present a greedy O(n)-time algorithm. Furthermore, we describe an isomorphism algorithm for Dijkstra graphs, whose complexity is also linear in the number of vertices of the graph. Both the recognition and isomorphism algorithms have potential important applications, such as in code similarity analysis.One of the early papers about structured programming was the article by Dijkstra "Go-to statement considered harmful" [8], which brought the idea that the unrestricted use of go-to statements is incompatible with well structured algorithms. That paper was soon followed by a discussion in the literature about go-to's, as in the papers by Knuth and Floyd [18], Wulf [34] and Knuth [17]. Other classical papers are those by Dahl and Hoare [9], Hoare [16] and Wirth [28], among others. Guidelines of structured programming were established in an article by Dijkstra [10]. The early development of programming languages containing blocks, such as ALGOL (Wirth [29]) and PASCAL (Naur [ 23]), was an important reason for structured programming's widespread adoption. This concept has been then further developed in papers by Kosaroju [20], describing the idea of reducibility among flowcharts. Moreover, [20] has introduced and characterized the class of D-charts, which in fact are graphs properly containing all those which originate from structured programming. Williams [32] also describes variations of different forms of structuredness, including the basic definitions by Dijkstra, as well as D-charts. The different forms of unstructuredness were described in papers by Williams [31] and McCabe [22]. The conversion of a unstructured flow diagram into a structured one has been considered by Williams and Ossher [33], and Oulsnam [24]. Formal aspects of structured programming include the papers by Böhm and Jacopini [4], Harel [12], and Kozen and Tseng [21]. A mathematical theory for modeling structuredness, designed for flow graphs, in general, has been described by Fenton, Whitty and Kaposi [11]. The actual influence of the concept of structured programming in the development of algorithms for solving various problems in different ar...