分道揚鑣

来源:http://www.cnblogs.com/jiasheng/archive/2016/06/23/5610311.html
-Advertisement-
Play Games

Description 編號為1…N 的N個城市之間以單向路連接,每一條道路有兩個參數:路的長度和通過這條路需付的費用。 Bob和Alice生活在城市1,但是當Bob發現了Alice玩撲克時欺騙他之後,他決定與她翻臉,離開城市1前往城市N。Bob想儘快到達城市N,但是他的錢不多。 希望你幫助Bob找 ...


Description

編號為1…N 的N個城市之間以單向路連接,每一條道路有兩個參數:路的長度和通過這條路需付的費用。

Bob和Alice生活在城市1,但是當Bob發現了Alice玩撲克時欺騙他之後,他決定與她翻臉,離開城市1前往城市N。Bob想儘快到達城市N,但是他的錢不多。

希望你幫助Bob找到一條從城市1到城市N的總費用不超過Bob的承受能力的最短路徑。

Input

輸入的第一行是3個整數 K, N, R ,其中:

    K:表示Bob能承受的最大費用,0 ≤ K ≤ 10000

    N:表示城市的總數,2 ≤ N ≤ 100

    R:表示道路的條數,1 ≤ R ≤ 10000

接下來的R行,每行用S  D  L  T(以空格隔開)表示一條道路:

    S:表示道路的出發城市,1 ≤ S ≤ N

    D:表示道路的目標城市,1 ≤ D ≤ N

    L:表示道路的長度,1 ≤ L ≤ 100

    T:表示通過這條道路需付的費用,0 ≤ T ≤ 100

Output

為每個測試用例輸出一行結果:總費用小於或等於最大費用K的最短路徑的長度。如果這樣的路徑不存在,則僅僅輸出 -1 。

Sample Input

5 6 7
1 2 2 3
2 4 3 3
3 4 2 4
1 3 4 1
4 6 2 1
3 5 2 0
5 4 3 2

Sample Output

11

Hint

測試數據的圖中可能有重邊、有自環

這題有一定難度,但學完DFS和BFS就要能夠AC它。它是一道典型的搜索題,而且需要強剪枝(去掉 當前已知無效的搜索路徑),以便加快搜索速度。

      一看題目,發現很像PTA里的一道題目:<a href = "https://pta.patest.cn/pta/test/558/exam/4/question/9931">旅游規劃</a>,但是解決思路不同,旅游規劃那道題是用迪傑斯特拉演算法的變形,這道題的思路是搜索所有城市1到城市N的可能路徑,然後選一條費用不超過K的最短路徑,有則輸出最短路徑長度,沒有則輸出-1。   偽代碼:
 1 DFS(LGraph G, int i, int K)
 2 {
 3     if(i == N)//說明搜索到了N城市
 4       bestDist = currDist; //最短路徑=當前路徑
 5     else
 6     {
 7            迴圈每一個G中下標為i的頂點的鄰接點
 8                 if(visited[adjvertex] == false && ck+adjvertex.cost<= K 
 9                 && currDist+adjvertex.dist<bestDist)
10                 { /*如果鄰接點沒有被訪問,剪枝:當前費用ck+到鄰接點費用小於等於K,當前距離+到鄰接點的距離小於最短距離*/
11                          ck+=adjvertex.cost;
12                          currDist+=adjvertex.dist;
13                          DFS(G, adjvertex, K);
14                          ck-=adjvertex.cost;
15                          currDist-=adjvertex.dist;
16
17                 }
18      }
19     
20      return bestDist;
21 }
  1 //DFS 函數自己實現才有收穫
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <stdbool.h>
  5 #include <string.h>
  6 
  7 #define MaxVertexNum 101    /* 最大頂點數設為101 */
  8 typedef int Vertex;         /* 用頂點下標表示頂點,為整型 */
  9 typedef struct{         /* 邊的權值設為距離和花費 */
 10     int dist, cost;
 11 }WeightType;
 12   
 13 /* 邊的定義 */
 14 typedef struct ENode *PtrToENode;
 15 struct ENode{
 16     Vertex V1, V2;      /* 有向邊<V1, V2> */
 17     WeightType Weight;  /* 權重 */
 18 };
 19 typedef PtrToENode Edge;
 20   
 21 /* 鄰接點的定義 */
 22 typedef struct AdjVNode *PtrToAdjVNode; 
 23 struct AdjVNode{
 24     Vertex AdjV;        /* 鄰接點下標 */
 25     WeightType Weight;  /* 邊權重 */
 26     PtrToAdjVNode Next;    /* 指向下一個鄰接點的指針 */
 27 };
 28   
 29 /* 頂點表頭結點的定義 */
 30 typedef struct Vnode{
 31     PtrToAdjVNode FirstEdge;/* 邊表頭指針 */
 32 } AdjList[MaxVertexNum];    /* AdjList是鄰接表類型 */
 33   
 34 /* 圖結點的定義 */
 35 typedef struct GNode *PtrToGNode;
 36 struct GNode{  
 37     int Nv;     /* 頂點數 */
 38     int Ne;     /* 邊數   */
 39     AdjList G;  /* 鄰接表 */
 40 };
 41 typedef PtrToGNode LGraph; /* 以鄰接表方式存儲的圖類型 */
 42 
 43 LGraph BuildGraph();
 44 LGraph CreateGraph( int VertexNum );
 45 void InsertEdge( LGraph Graph, Edge E );
 46 int DFS(LGraph G, int n);
 47 
 48 bool visited[MaxVertexNum];
 49 int K;
 50 int ck;            //當前花費
 51 int bestDist;    //最好的路程
 52 int currDist;    //當前的路程
 53 
 54 int main()
 55 {
 56     int result;
 57     scanf("%d",&K);
 58     LGraph G = BuildGraph();
 59     memset(visited, false, sizeof(visited));
 60     ck = currDist = 0;
 61     visited[1] = true;
 62     bestDist = 0xffff;
 63     result = DFS(G, 1);
 64     if (bestDist == 0xffff) //說明沒有符合的路徑,返回-1
 65         result = -1;
 66     printf("%d\n",result);
 67     getchar();getchar();
 68     return 0;
 69 }
 70 
 71 LGraph CreateGraph( int VertexNum )
 72 { /* 初始化一個有VertexNum個頂點但沒有邊的圖 */
 73     Vertex V;
 74     LGraph Graph;
 75       
 76     Graph = (LGraph)malloc( sizeof(struct GNode) ); /* 建立圖 */
 77     Graph->Nv = VertexNum;
 78     Graph->Ne = 0;
 79     /* 初始化鄰接表頭指針 */
 80     /* 註意:這裡預設頂點編號從1開始,到(Graph->Nv) */
 81        for (V=1; V<=Graph->Nv; V++)
 82         Graph->G[V].FirstEdge = NULL;
 83               
 84     return Graph; 
 85 }
 86          
 87 void InsertEdge( LGraph Graph, Edge E )
 88 {
 89     PtrToAdjVNode NewNode;
 90       
 91     /* 插入邊 <V1, V2> */
 92     /* 為V2建立新的鄰接點 */
 93     NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
 94     NewNode->AdjV = E->V2;
 95     NewNode->Weight = E->Weight;
 96     /* 將V2插入V1的表頭 */
 97     NewNode->Next = Graph->G[E->V1].FirstEdge;
 98     Graph->G[E->V1].FirstEdge = NewNode;
 99 }
100   
101 LGraph BuildGraph()
102 {
103     LGraph Graph;
104     Edge E;
105     Vertex V;
106     int Nv, i;
107       
108     scanf("%d", &Nv);   /* 讀入頂點個數 */
109     Graph = CreateGraph(Nv); /* 初始化有Nv個頂點但沒有邊的圖 */ 
110       
111     scanf("%d", &(Graph->Ne));   /* 讀入邊數 */
112     if ( Graph->Ne != 0 ) { /* 如果有邊 */ 
113         E = (Edge)malloc( sizeof(struct ENode) ); /* 建立邊結點 */ 
114         /* 讀入邊,格式為"起點 終點 權重",插入鄰接表 */
115         for (i=0; i<Graph->Ne; i++) {
116             scanf("%d %d %d %d", &E->V1, &E->V2, &E->Weight.dist, &E->Weight.cost); 
117             InsertEdge( Graph, E );
118         }
119     } 
120     return Graph;
121 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 迴圈:反覆執行某段代碼。 迴圈四要素:初始條件,迴圈條件,迴圈體,狀態改變。 for(初始條件;迴圈條件;狀態改變) { 迴圈體 } break ——中斷迴圈,跳出整個迴圈 continue——停止本次迴圈,進入下次迴圈。 註:●執行步驟:初始條件——迴圈條件——迴圈體——狀態改變。 ●死迴圈:出不 ...
  • 博問裡面發了幾次了,看的人太少了,回答的人更少,而且都沒有解決,這次發首頁,希望管理手下留情,真心這個問題一個月了,一直沒解決掉。高抬貴手 項目生成成功後,右鍵.tt文件,然後 ,然後調試T4模板成功,就OK瞭然而每次運行自定義工具,就會報錯,應該是Machine config的錯誤,但是一直不會改 ...
  • 這兩天在群里有人咨詢有沒有現成的.net mvc分頁方法,由此寫了一個簡單分頁工具,這裡簡單分享下實現思路,代碼,希望能對大家有些幫助,鼓勵大家多造些輪子還是好的。 A.效果(這裡用了bootstrap的樣式) B.分析,知識點 a.分頁通常由一下幾個屬性組成(當前頁,總條數,分頁記錄數,路由地址) ...
  • 預設是get提交,如果是post提交需要在控制器ActionResult上加:[AcceptVerbs(HttpVerbs.Post)] 舉例: 在HelpController中,會定義如下的Action: [AcceptVerbs(HttpVerbs.Post)] public ActionRes ...
  • 1.最簡單的非同步運行class Program { static void Main(string [] args) { Task.Run(() => { // Task能這麼靈活,也是因為有了Lambda呀。 Console.WriteLine("我是另一個線程:Thread Id {0}", T... ...
  • 我們在前一個練習中已經瞭解瞭如何在C#控制台程式(console)中讀取用戶的輸入。現在我們要學習如何從一個文件中讀取內容。在下麵的練習中,你要格外小心。關於文件的操作,一不小心會損失你的重要文件。 在這個練習中我們首先要創建一個純文本文件ex10_sample.txt 放到c盤的Exercise1 ...
  • 1.時間比較大小 DateTime t1 = new DateTime(100); DateTime t2 = new DateTime(20); if (DateTime.Compare(t1, t2) > 0) Console.WriteLine("t1 > t2"); // t1 大 if ( ...
  • C#複習⑧ 2016年6月22日 13:50 Main Attribute & Threads 屬性與線程 1.Conditional Attribute 條件屬性 斷言僅被調用,如果定義了debug。 Assert is only called, if debug was defined. 還可用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...