{"id":663,"date":"2019-06-09T09:11:43","date_gmt":"2019-06-09T01:11:43","guid":{"rendered":"http:\/\/fankasy.xyz\/?p=663"},"modified":"2019-09-25T09:14:37","modified_gmt":"2019-09-25T01:14:37","slug":"noj1047-%e5%9b%be%e7%9a%84%e6%b7%b1%e5%ba%a6%e4%bc%98%e5%85%88%e9%81%8d%e5%8e%86%e5%ba%8f%e5%88%97","status":"publish","type":"post","link":"http:\/\/fankasy.xyz\/index.php\/2019\/06\/09\/noj1047-%e5%9b%be%e7%9a%84%e6%b7%b1%e5%ba%a6%e4%bc%98%e5%85%88%e9%81%8d%e5%8e%86%e5%ba%8f%e5%88%97\/","title":{"rendered":"NOJ1047 \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u5e8f\u5217"},"content":{"rendered":"<pre>#include&lt;stdio.h&gt; \/\/ printf()\r\n#include&lt;stdlib.h&gt; \/\/ malloc(), free()\r\n#include&lt;limits.h&gt; \/\/ INT_MAX for noEdgeValue\r\n\r\ntypedef int ElemType;\r\n\r\ntypedef int BOOL;\r\n#define TRUE 0\r\n#define FALSE -1\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\/\/ P.34\r\n\/\/ Program 3.2 Queue\r\ntypedef struct\r\n{\r\n    int front;\r\n    int rear;\r\n    int maxSize;\r\n    ElemType* element;\r\n}Queue;\r\n\r\nvoid Create(Queue* Q, int mSize)\r\n{\r\n    Q-&gt;maxSize = mSize;\r\n    Q-&gt;element = (ElemType*)malloc(sizeof(ElemType) * mSize);\r\n    Q-&gt;front = Q-&gt;rear = 0;\r\n}\r\n\r\n\/\/ Function name conflicted with Destroy() of mGraph, so I changed its name...\r\nvoid Destroy_Queue(Queue* Q)\r\n{\r\n    Q-&gt;maxSize = -1;\r\n    free(Q-&gt;element);\r\n    Q-&gt;front = Q-&gt;rear = -1;\r\n}\r\n\r\nBOOL IsEmpty(Queue* Q)\r\n{\r\n    return Q-&gt;front == Q-&gt;rear;\r\n}\r\n\r\nBOOL IsFull(Queue* Q)\r\n{\r\n    return (Q-&gt;rear + 1) % Q-&gt;maxSize == Q-&gt;front;\r\n}\r\n\r\nBOOL Front(Queue * Q, ElemType * x)\r\n{\r\n    if (IsEmpty(Q))\r\n        return FALSE;\r\n\r\n    *x = Q-&gt;element[(Q-&gt;front + 1) % Q-&gt;maxSize];\r\n\r\n    return TRUE;\r\n}\r\n\r\nBOOL EnQueue(Queue * Q, ElemType x)\r\n{\r\n    if (IsFull(Q))\r\n        return FALSE;\r\n\r\n    Q-&gt;rear = (Q-&gt;rear + 1) % Q-&gt;maxSize;\r\n    Q-&gt;element[Q-&gt;rear] = x;\r\n\r\n    return TRUE;\r\n}\r\n\r\nBOOL DeQueue(Queue * Q)\r\n{\r\n    if (IsEmpty(Q))\r\n        return FALSE;\r\n\r\n    Q-&gt;front = (Q-&gt;front + 1) % Q-&gt;maxSize;\r\n\r\n    return TRUE;\r\n}\r\n\r\nvoid Clear(Queue * Q)\r\n{\r\n    Q-&gt;front = Q-&gt;rear = 0;\r\n}\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\/\/ MGraph\r\n\/\/ P.139 - 141\r\n\r\n\/\/ P.139\r\ntypedef int ElemType;\r\ntypedef struct\r\n{\r\n    ElemType** a;\r\n    int n;\r\n    int e;\r\n    ElemType noEdge;\r\n}mGraph;\r\n\r\n\/\/ P.139 Program 9.1\r\n#define ERROR 0\r\n#define OK 1\r\n#define Overflow 2\r\n#define Underflow 3\r\n#define NotPresent 4\r\n#define Duplicate 5\r\ntypedef int Status;\r\n\r\nStatus Init(mGraph * mg, int nSize, ElemType noEdgeValue)\r\n{\r\n    int i, j;\r\n\r\n    mg-&gt;n = nSize;\r\n    mg-&gt;e = 0;\r\n    mg-&gt;noEdge = noEdgeValue;\r\n    mg-&gt;a = (ElemType * *)malloc(nSize * sizeof(ElemType*));\r\n    if (!mg-&gt;a)\r\n        return ERROR;\r\n\r\n    for (i = 0; i &lt; mg-&gt;n; i++)\r\n    {\r\n        mg-&gt;a[i] = (ElemType*)malloc(nSize * sizeof(ElemType));\r\n\r\n        for (j = 0; j &lt; mg-&gt;n; j++)\r\n            mg-&gt;a[i][j] = mg-&gt;noEdge;\r\n\r\n        mg-&gt;a[i][i] = 0;\r\n    }\r\n\r\n    return OK;\r\n}\r\n\r\n\/\/ P.140 Program 9.2\r\nvoid Destroy(mGraph * mg)\r\n{\r\n    int i;\r\n\r\n    for (i = 0; i &lt; mg-&gt;n; i++)\r\n        free(mg-&gt;a[i]);\r\n\r\n    free(mg-&gt;a);\r\n}\r\n\r\n\/\/ P.140 Program 9.3\r\nStatus Exist(mGraph * mg, int u, int v)\r\n{\r\n    if (u&lt;0 || v&lt;0 || u&gt;mg-&gt;n - 1 || v&gt;mg-&gt;n - 1 || u == v || mg-&gt;a[u][v] == mg-&gt;noEdge)\r\n        return ERROR;\r\n\r\n    return OK;\r\n}\r\n\r\n\/\/ P.140 Program 9.4\r\nStatus Insert(mGraph * mg, int u, int v, ElemType w)\r\n{\r\n    if (u&lt;0 || v&lt;0 || u&gt;mg-&gt;n - 1 || v&gt;mg-&gt;n - 1 || u == v)\r\n        return ERROR;\r\n\r\n    if (mg-&gt;a[u][v] != mg-&gt;noEdge)\r\n        return Duplicate;\r\n\r\n    mg-&gt;a[u][v] = w;\r\n    mg-&gt;e++;\r\n\r\n    return OK;\r\n}\r\n\r\n\/\/ P.140 Program 9.5\r\nStatus Remove(mGraph * mg, int u, int v)\r\n{\r\n    if (u&lt;0 || v&lt;0 || u&gt;mg-&gt;n - 1 || v&gt;mg-&gt;n - 1 || u == v)\r\n        return ERROR;\r\n\r\n    if (mg-&gt;a[u][v] == mg-&gt;noEdge)\r\n        return NotPresent;\r\n\r\n    mg-&gt;a[u][v] = mg-&gt;noEdge;\r\n    mg-&gt;e--;\r\n\r\n    return OK;\r\n}\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\/\/ DFS\r\n\/\/ There are not any DFS programs based on MGraph in the textbook, \r\n\/\/ so I made it...\r\nvoid DFS(int v, int visited[], mGraph g)\r\n{\r\n    int i;\r\n\r\n    printf(\"%d \", v);\r\n    visited[v] = 1;\r\n\r\n    for (i = 0; i &lt; g.n; i++)\r\n    {\r\n        if (g.a[v][i] != 0 &amp;&amp; g.a[v][i] != g.noEdge &amp;&amp; !visited[i])\r\n        {\r\n            DFS(i, visited, g);\r\n        }\r\n    }\r\n}\r\n\r\nvoid DFSGraph(mGraph g)\r\n{\r\n    int i;\r\n\r\n    \/\/ Init visited\r\n    int* visited = malloc(g.n * sizeof(int));\r\n    for (i = 0; i &lt; g.n; i++)\r\n        visited[i] = 0;\r\n\r\n    \/\/ Do DFS\r\n    for (i = 0; i &lt; g.n; i++)\r\n    {\r\n        if (!visited[i])\r\n        {\r\n            DFS(i, visited, g);\r\n        }\r\n    }\r\n\r\n    free(visited);\r\n}\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\/\/ BFS\r\n\/\/ There are not any BFS programs based on MGraph in the textbook, \r\n\/\/ so I made it...\r\nvoid BFS(int v, int visited[], mGraph g)\r\n{\r\n    int i;\r\n\r\n    Queue q;\r\n    Create(&amp;q, g.n);\r\n\r\n    visited[v] = 1;\r\n    printf(\"%d \", v);\r\n\r\n    EnQueue(&amp;q, v);\r\n    while (!IsEmpty(&amp;q))\r\n    {\r\n        Front(&amp;q, &amp;v);\r\n        DeQueue(&amp;q);\r\n\r\n        for (i = 0; i &lt; g.n; i++)\r\n        {\r\n            if (g.a[v][i] != 0 &amp;&amp; g.a[v][i] != g.noEdge &amp;&amp; !visited[i])\r\n            {\r\n                visited[i] = 1;\r\n                printf(\"%d \", i);\r\n                EnQueue(&amp;q, i);\r\n            }\r\n\r\n        }\r\n    }\r\n}\r\n\r\nvoid BFSGraph(mGraph g)\r\n{\r\n    int i;\r\n\r\n    \/\/ Init visited\r\n    int* visited = malloc(g.n * sizeof(int));\r\n    for (i = 0; i &lt; g.n; i++)\r\n        visited[i] = 0;\r\n\r\n    \/\/ Do BFS\r\n    for (i = 0; i &lt; g.n; i++)\r\n    {\r\n        if (!visited[i])\r\n        {\r\n            BFS(i, visited, g);\r\n        }\r\n    }\r\n\r\n    free(visited);\r\n}\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\nint main()\r\n{\r\n    mGraph GBA;\r\n    int nSize = 0, edge = 0;\r\n    int u = 0, v = 0;\r\n    scanf(\"%d %d\", &amp;nSize, &amp;edge);\r\n    Init(&amp;GBA, nSize, 0);\r\n    for (int a = 0; a &lt; edge; a++)\r\n    {\r\n        scanf(\"%d %d\", &amp;u, &amp;v);\r\n        Insert(&amp;GBA, u, v, 1);\r\n        Insert(&amp;GBA, v, u, 1);\r\n    }\r\n    for (int f = 0; f &lt; nSize; f++)\r\n    {\r\n        for (int r = 0; r &lt; nSize; r++)\r\n            printf(\"%d \", GBA.a[f][r]);\r\n        printf(\"\\n\");\r\n    }\r\n    DFSGraph(GBA);\r\n\r\n    Destroy(&amp;GBA);\r\n\r\n    return 0;\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>#include&lt;stdio.h&gt; \/\/ printf() #include&lt;stdlib. [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[17],"tags":[],"_links":{"self":[{"href":"http:\/\/fankasy.xyz\/index.php\/wp-json\/wp\/v2\/posts\/663"}],"collection":[{"href":"http:\/\/fankasy.xyz\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/fankasy.xyz\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/fankasy.xyz\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/fankasy.xyz\/index.php\/wp-json\/wp\/v2\/comments?post=663"}],"version-history":[{"count":0,"href":"http:\/\/fankasy.xyz\/index.php\/wp-json\/wp\/v2\/posts\/663\/revisions"}],"wp:attachment":[{"href":"http:\/\/fankasy.xyz\/index.php\/wp-json\/wp\/v2\/media?parent=663"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/fankasy.xyz\/index.php\/wp-json\/wp\/v2\/categories?post=663"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/fankasy.xyz\/index.php\/wp-json\/wp\/v2\/tags?post=663"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}