1269 匈牙利游戲 2012年CCC加拿大高中生信息學奧賽

来源:http://www.cnblogs.com/zwfymqz/archive/2017/04/17/6724763.html
-Advertisement-
Play Games

1269 匈牙利游戲 2012年CCC加拿大高中生信息學奧賽 1269 匈牙利游戲 2012年CCC加拿大高中生信息學奧賽 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鑽石 Diamond 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鑽石 Diamond ...


1269 匈牙利游戲

2012年CCC加拿大高中生信息學奧賽

時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鑽石 Diamond         題目描述 Description

Welcome to the Hungary Games! The streets of Budapest form a twisted network of one-way streets.

歡迎來到匈牙利游戲!佈達佩斯(匈牙利首都)的街道形成了一個彎曲的單向網路。

You have been forced to join a race as part of a “Reality TV” show where you race through these streets, starting at the Sz´echenyi thermal bath (s for short) and ending at the Tomb of G¨ ul Baba (t for short).

你被強制要求參加一個賽跑作為一個TV秀的一部分節目,比賽中你需要穿越這些街道,從s開始,到t結束。

Naturally, you want to complete the race as quickly as possible, because you will get more promo- tional contracts the better you perform.

很自然的,你想要儘快的完成比賽,因為你的比賽完成的越好,你就能得到更多的商業促銷合同。

However, there is a catch: any person who is smart enough to take a shortest s-t route will be thrown into the P´alv¨olgyi cave system and kept as a national treasure. You would like to avoid this fate, but still be as fast as possible. Write a program that computes a strictly-second-shortest s-t route.

但是,有一個需要瞭解的是,如果有人過於聰明找到從s到t的最短路線,那麼他就被扔到國家極品人類保護系統中作為一個國家寶藏收藏起來。你顯然要避免這種事情的發生,但是也想越快越好。寫一個程式來計算一個從s到t的嚴格次短路線吧。

Sometimes the strictly-second-shortest route visits some nodes more than once; see Sample Input 2 for an example.

有的時候,嚴格次短路線可能訪問某些節點不止一次。樣例2是一個例子。

輸入描述 Input Description

The first line will have the format N M, where N is the number of nodes in Budapest and M is the number of edges. The nodes are 1,2,...,N; node 1 represents s; node N represents t. Then there are M lines of the form A B L, indicating a one-way street from A to B of length L. You can assume that A != B on these lines, and that the ordered pairs (A,B) are distinct.

第一行包含兩個整數N和M,N代表佈達佩斯的節點個數,M代表邊的個數。節點編號從1到N。1代表出發點s,N代表終點t。接下來的M行每行三個整數A B L,代表有一條從A到B的長度為L的單向同路。你可以認為A不等於B,也不會有重覆的(A,B)對。

輸出描述 Output Description

Output the length of a strictly-second-shortest route from s to t. If there are less than two possible lengths for routes from s to t, output −1.

輸出從s到t的嚴格次短路的長度。如果從s到t的路少於2條,輸出-1。

樣例輸入 Sample Input

樣例輸入1:

4 6

1 2 5

1 3 5

2 3 1

2 4 5

3 4 5

1 4 13

樣例輸入2:

2 2

1 2 1

2 1 1

樣例輸出 Sample Output

樣例輸出1:

11

樣例輸出2:

3

數據範圍及提示 Data Size & Hint

對於樣例1:

There are two shortest routes of length 10 (1 → 2 → 4,1 → 3 → 4) and the strictly-second- shortest route is 1 → 2 → 3 → 4 with length 11.

對於樣例2:

The shortest route is 1 → 2 of length 1, and the strictly-second route is 1 → 2 → 1 → 2 of length 3.

分類標簽 Tags

求次短路的問題

註意spfa中的三條註釋

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 using namespace std;
 6 const int MAXN=100001;
 7 const int maxn=0xfffffff;
 8 struct node
 9 {
10     int u;
11     int v;
12     int w;
13     int next;
14 }edge[MAXN];
15 int num=1;
16 int head[MAXN];
17 int n,m;
18 int dis[MAXN];
19 int vis[MAXN];// 是否在隊列中 
20 int tot=0;
21 int pre[MAXN];// 記錄次短路 
22 void spfa()
23 {
24     dis[1]=0;
25     vis[1]=1;
26     queue<int>q;
27     q.push(1);
28     while(q.size()!=0)
29     {
30         int p=q.front();
31         q.pop();
32         vis[p]=0;
33         for(int i=head[p];i!=-1;i=edge[i].next)
34         {
35             int to=edge[i].v;
36             if(dis[to]>dis[p]+edge[i].w)
37             {
38                 pre[to]=dis[to];// 記錄下更新之前的長度 即次長 
39                 dis[to]=dis[p]+edge[i].w;
40                 //if(edge[i].v==n)tot++;
41                 if(vis[to]==0)
42                 {
43                     q.push(to);
44                     vis[to]=1;
45                 }
46             }
47             else if(dis[to]!=dis[p]+edge[i].w&&pre[to]>dis[p]+edge[i].w)
48             {
49                 pre[to]=dis[p]+edge[i].w;// 根據條件,此時需要更新,否則就不是次短路 
50                 if(vis[to]==0)
51                 {
52                     q.push(to);
53                     vis[to]=1;
54                 }
55             }
56             if(pre[to]>pre[p]+edge[i].w)// 同理,需要更新 
57             {
58                 pre[to]=pre[p]+edge[i].w;
59                 if(vis[to]==0)
60                 {
61                     q.push(to);
62                     vis[to]=1;
63                 }
64             }
65         }
66     }
67 }
68 int main()
69 {
70     scanf("%d%d",&n,&m);
71     for(int i=1;i<=n;i++)
72     {
73         head[i]=-1;
74         dis[i]=maxn;
75         pre[i]=maxn;
76     }
77     for(int i=1;i<=m;i++)
78     {
79         scanf("%d%d%d",&edge[num].u,&edge[num].v,&edge[num].w);
80         edge[num].next=head[edge[num].u];
81         head[edge[num].u]=num++;
82     }
83     spfa();
84     if(pre[n]!=maxn)
85     printf("%d",pre[n]);
86     else
87     {
88         printf("-1");
89     }
90     return 0;
91 }

 


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

-Advertisement-
Play Games
更多相關文章
  • 如何個判斷集合中是否存在某個元素——contains() 1.List的contains(obj)方法 實際上,List調用contains(Object obj)方法時,會遍歷List中的每一個元素,然後再調用每個元素的equals()方法去跟contains()方法中的參數進行比較,如果有一個元 ...
  • 問題描述:一進程剛獲得三個主存塊的使用權,若該進程訪問頁面的次序是1,2,3,4,1,2,5,1,2,3,4,5。當採用LRU演算法時,發生的缺頁次數是多少? Hint:LRU(Least Recently Used)意思是近期最少使用。 這個演算法常用於頁面置換演算法中。當我們新要訪問的頁面不在主存中時 ...
  • 使用toPlainString意為返回不不待指數的字元串 與toString區別當數據的位數為0的時候,使用toString就會出現無法正的的轉化的問題。 所以在處理科學計數法是不適用toString而是toPlainString,避免偶發錯誤發生。 ...
  • 一、模塊的認識。 模塊:指的是把預先寫好的內容封裝成一個模塊,可用時直接調用,模塊又稱為庫 模塊又稱為標準庫和第三方庫。 標準庫,預設安裝好官方所公佈的庫 C:\Python35\Lib 第三方庫,是從網上下載下來需要安裝上去。C:\Python35\Lib\site-packages getpas ...
  • <!-- 占用一個節點對象 --><province> <city code="027">武漢</city> <city code="0716">荊州</city> <city code="0718">宜昌</city></province><!-- 占用第三個節點對象 --> JAVA代碼如下: ...
  • 繼承(inheritance)是面向對象編程的核心機制之一,沒有使用繼承的程式設計,就不能成為面向對象的程式設計。 1.繼承的定義 特殊類的對象擁有一般類的全部屬性與行為,稱為特殊類對一般類的繼承。一個類可以是多個一般類的特殊類,也可以從多個一般類中繼承屬性與行為,但在java語言中,不允許一個類從 ...
  • 本文大綱 一、簡介 二、緩存的概念 三、自定義實現緩存機制 四、什麼是Ehcache 五、Ehcache怎麼用 六、Spring對緩存的支持 七、Spring+Ehcache實現 八、Spring+Shiro+Ehcache實現 九、總結 一、簡介 在項目中,用到Shiro來做驗證授權的控制。但在實 ...
  • 這算是一個系列吧,記錄一下在準備秋招期間,所準備的C++面試題,望秋招順利。所有的面試題均來源於各大論壇,網路 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...