{"id":667,"date":"2019-06-09T09:15:57","date_gmt":"2019-06-09T01:15:57","guid":{"rendered":"http:\/\/fankasy.xyz\/?p=667"},"modified":"2019-09-25T09:16:58","modified_gmt":"2019-09-25T01:16:58","slug":"noj1049-%e9%a3%9e%e6%9c%ba%e6%9c%80%e5%b0%91%e6%8d%a2%e4%b9%98%e6%ac%a1%e6%95%b0%e9%97%ae%e9%a2%98","status":"publish","type":"post","link":"http:\/\/fankasy.xyz\/index.php\/2019\/06\/09\/noj1049-%e9%a3%9e%e6%9c%ba%e6%9c%80%e5%b0%91%e6%8d%a2%e4%b9%98%e6%ac%a1%e6%95%b0%e9%97%ae%e9%a2%98\/","title":{"rendered":"NOJ1049 \u98de\u673a\u6700\u5c11\u6362\u4e58\u6b21\u6570\u95ee\u9898"},"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\/\/n is the number of edges\r\nvoid Dijkstra(mGraph g,int n, int start)\r\n{\r\n    int* d = calloc(n, sizeof(int));  \/\/storage the distance\r\n    int* s = calloc(n, sizeof(int));  \/\/record which node has been confirmed\r\n    int minrange =999 ;\r\n    for (int y = 0; y &lt; n; y++)\r\n    {\r\n        d[y] = g.a[start][y];   \/\/initlize the array'd', storage the inital range\r\n    }\r\n    s[start] = 1;\r\n    \/\/Initilize completed\r\n\r\n\r\n\r\n\r\n    for (int y = start; y&lt;n||(y%n &lt; start); y++)\r\n    {\r\n        int temp = -1; minrange = 999;\r\n        for (int u = start; u&lt;n||(u%n &lt; start); u++)    \/\/find the minium and mark\r\n        {\r\n            if (s[u%n] == 0 &amp;&amp; d[u%n] &lt; minrange)\r\n            {\r\n                minrange = d[u%n];\r\n                temp = u%n;\r\n            }\r\n        }\r\n        if (temp == -1)\r\n            break;\r\n        s[temp] = 1;   \/\/mark the minium range\r\n        for (int u = start; u &lt; n || (u % n &lt; start) ; u++)\r\n        {\r\n            if (g.a[temp][u%n] + d[temp] &lt; d[u%n] )      \/\/current range plus transfer cost still less than origin distance...\r\n                d[u%n] = g.a[temp][u%n] + d[temp];          \/\/update the range\r\n        }\r\n    }\r\n\r\n\r\n\r\n\r\n    for (int y = 0; y &lt; n; y++) { if (y == start) { ; } else { if (d[y] &gt; 999)\r\n                printf(\"-1\\n\");\r\n            else\r\n                printf(\"%d\\n\", d[y]);\r\n        }\r\n    }\r\n\r\n\r\n    free(d);\r\n    free(s);\r\n}\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 start = 0;\r\n    int u = 0, v = 0;\r\n    scanf(\"%d %d %d\", &amp;nSize, &amp;edge, &amp;start);\r\n    Init(&amp;GBA, nSize, 65536);\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    }\r\n    Dijkstra(GBA, nSize, start);\r\n \r\n    \/\/\u8fd9\u91cc\u9700\u8981\u5bfb\u627e\u6700\u77ed\u8def\u5f84\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\/667"}],"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=667"}],"version-history":[{"count":0,"href":"http:\/\/fankasy.xyz\/index.php\/wp-json\/wp\/v2\/posts\/667\/revisions"}],"wp:attachment":[{"href":"http:\/\/fankasy.xyz\/index.php\/wp-json\/wp\/v2\/media?parent=667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/fankasy.xyz\/index.php\/wp-json\/wp\/v2\/categories?post=667"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/fankasy.xyz\/index.php\/wp-json\/wp\/v2\/tags?post=667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}