分層圖+最短路算法 BZOJ 2763: [JLOI2011]飛行路線

2763: [JLOI2011]飛行路線

Time Limit:?10 Sec??Memory Limit:?128 MB

Description

Alice和Bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在n個城市設有業務,設這些城市分別標記為0到n-1,一共有m種航線,每種航線連接兩個城市,并且航線有一定的價格。Alice和Bob現在要從一個城市沿著航線到達另一個城市,途中可以進行轉機。航空公司對他們這次旅行也推出優惠,他們可以免費在最多k種航線上搭乘飛機。那么Alice和Bob這次出行最少花費多少?

Input

數據的第一行有三個整數,n,m,k,分別表示城市數,航線數和免費乘坐次數。
第二行有兩個整數,s,t,分別表示他們出行的起點城市編號和終點城市編號。(0<=s,t<n)
接下來有m行,每行三個整數,a,b,c,表示存在一種航線,能從城市a到達城市b,或從城市b到達城市a,價格為c。(0<=a,b<n,a與b不相等,0<=c<=1000)

Output

只有一行,包含一個整數,為最少花費。

Sample Input

5 6 1
0 4
0 1 5
1 2 5
2 3 5
3 4 5
2 3 3
0 2 100

Sample Output

8

HINT

?

對于30%的數據,2<=n<=50,1<=m<=300,k=0;


對于50%的數據,2<=n<=600,1<=m<=6000,0<=k<=1;


對于100%的數據,2<=n<=10000,1<=m<=50000,0<=k<=10.

?

 1 #include <queue>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define N 11000
 6 #define M 51000
 7 #define inf 0x3f3f3f3f
 8 using namespace std;
 9 struct KSD
10 {
11     int v,len,next;
12 }e[M<<1];
13 int head[N],cnt;
14 struct Lux
15 {
16     int x,y;
17     Lux(int a,int b):x(a),y(b){}
18     Lux(){}
19 };
20 void add(int u,int v,int len)
21 {
22     ++cnt;
23     e[cnt].v=v;
24     e[cnt].len=len;
25     e[cnt].next=head[u];
26     head[u]=cnt;
27 }
28 int n,m,p,s,t;
29 int dist[11][N];
30 bool in[11][N];/*spfa的dist,標記在每一層都要有*/
31 queue<Lux>q;
32 int spfa()
33 {
34     int i,v;
35     memset(dist,0x3f,sizeof(dist));
36     q.push(Lux(0,s));/*從第0層開始spfa*/
37     dist[0][s]=0;
38     in[0][s]=1;
39     while(!q.empty())
40     {
41         Lux U=q.front();
42         q.pop();
43         in[U.x][U.y]=0;
44 
45         for(i=head[U.y];i;i=e[i].next)
46         {
47             v=e[i].v;/*先跑完這一層的最短路*/
48             if(dist[U.x][v]>dist[U.x][U.y]+e[i].len)
49             {
50                 dist[U.x][v]=dist[U.x][U.y]+e[i].len;
51                 if(!in[U.x][v])q.push(Lux(U.x,v)),in[U.x][v]=1;
52             }
53         }
54         if(U.x<p)for(i=head[U.y];i;i=e[i].next)
55         {/*如果還可以向下一層轉移的話,就把這個點出發的每一條邊都設為免費下一層轉移,因為要記錄每個點dist到底用了幾個免費的路線,所以用二維數組--分層思想*/
56             v=e[i].v;
57             if(dist[U.x+1][v]>dist[U.x][U.y])
58             {
59                 dist[U.x+1][v]=dist[U.x][U.y];
60                 if(!in[U.x+1][v])q.push(Lux(U.x+1,v)),in[U.x+1][v]=1;
61             }
62         }
63     }
64 
65     int ret=inf;
66     for(i=0;i<=p;i++)ret=min(ret,dist[i][t]);/*在每一層中都找到t的最小值(最多k條免費),為什么要在每一層都找,而不是只在最后一層尋找呢。假設有這么一種情況,由s--t的最少的路上的途徑數目少于k條,那么在k之前的某一層上就有dis=0,但是如果必須使用k條路徑的話,那么就會找的一條路途數多于k的路來滿足這個條件,那么只用第k層的dis自然不是正確結果了。*/
67     return ret;
68 }
69 
70 int main()
71 {
72 //    freopen("test.in","r",stdin);
73     int i,j,k;
74     int a,b,c;
75     scanf("%d%d%d%d%d",&n,&m,&p,&s,&t);
76     for(i=1;i<=m;i++)
77     {
78         scanf("%d%d%d",&a,&b,&c);
79         add(a,b,c);/*無向圖建立雙向邊*/
80         add(b,a,c);
81     }
82     printf("%d\n",spfa());
83     return 0;
84 }
  1 /*我的代碼*/
  2 #define K 11
  3 #include<iostream>
  4 using namespace std;
  5 #include<cstdio>
  6 #include<queue>
  7 #include<cstring>
  8 #define N 10010
  9 #define M 50010
 10 struct QU{
 11     int ce,bh;
 12 };
 13 struct  Edge{
 14     int v,w,last;
 15 }edge[M<<1];
 16 int head[N],dis[K][N],k,n,m,t=0,sta,en;
 17 bool inque[K][N];
 18 inline int read()
 19 {
 20     int ff=1,ret=0;
 21     char s=getchar();
 22     while(s<'0'||s>'9')
 23     {
 24         if(s=='-') ff=-1;
 25         s=getchar();
 26     }
 27     while(s>='0'&&s<='9')
 28     {
 29         ret=ret*10+s-'0';
 30         s=getchar();
 31     }
 32     return ret*ff;
 33 }
 34 void add_edge(int u,int v,int w)
 35 {
 36     ++t;
 37     edge[t].v=v;
 38     edge[t].w=w;
 39     edge[t].last=head[u];
 40     head[u]=t;
 41 }
 42 void input()
 43 {
 44     n=read();m=read();k=read();
 45     sta=read();en=read();
 46     int a,b,c;
 47     for(int i=1;i<=m;++i)
 48     {
 49         a=read();b=read();c=read();
 50         add_edge(a,b,c);
 51         add_edge(b,a,c);
 52     }
 53 }
 54 void SPFA()
 55 {
 56     memset(dis,100,sizeof(dis));/*注意賦值的最大值不要超界*/
 57     dis[0][sta]=0;
 58     inque[0][sta]=true;
 59     queue<QU>Q;
 60     QU A;
 61     A.ce=0;
 62     A.bh=sta;
 63     Q.push(A);
 64     while(!Q.empty())
 65     {
 66         QU NOw=Q.front();
 67         Q.pop();
 68         inque[NOw.ce][NOw.bh]=false;
 69         for(int l=head[NOw.bh];l;l=edge[l].last)
 70         {
 71             if(dis[NOw.ce][edge[l].v]>edge[l].w+dis[NOw.ce][NOw.bh])
 72             {
 73                 dis[NOw.ce][edge[l].v]=edge[l].w+dis[NOw.ce][NOw.bh];
 74                 if(!inque[NOw.ce][edge[l].v])
 75                 {
 76                     inque[NOw.ce][edge[l].v]=true;
 77                     QU C;
 78                     C.bh=edge[l].v;
 79                     C.ce=NOw.ce;
 80                     Q.push(C);
 81                 }
 82             }
 83         }
 84         if(NOw.ce==k) continue;
 85         for(int l=head[NOw.bh];l;l=edge[l].last)
 86         {
 87             if(dis[NOw.ce+1][edge[l].v]>dis[NOw.ce][NOw.bh])
 88             {
 89                 dis[NOw.ce+1][edge[l].v]=dis[NOw.ce][NOw.bh];
 90                 if(!inque[NOw.ce+1][edge[l].v])
 91                 {
 92                     inque[NOw.ce+1][edge[l].v]=true;
 93                     QU C;
 94                     C.bh=edge[l].v;
 95                     C.ce=NOw.ce+1;
 96                     Q.push(C);
 97                 }
 98             }
 99         }
100     }
101 }
102 int main()
103 {
104     input();
105     SPFA();
106     int ans=(1<<31)-1;
107     for(int i=0;i<=k;++i)
108       ans=min(ans,dis[i][en]);
109     printf("%d\n",ans);
110     return 0;
111 }
112  

?

?

轉載于:https://www.cnblogs.com/c1299401227/p/5900825.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372249.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372249.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372249.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java web 保護_java web項目請求控制及簡單漏洞防范

背景&#xff1a;當時項目沒用什么框架&#xff0c;過濾器&#xff0c;請求限制等都需要自己手寫。1、請求加時間戳在后臺過濾器中可以加判斷&#xff0c;如果請求時間戳與服務器時間相差太大&#xff0c;可以返回異常&#xff0c;具體情況可以具體使用。請求中加時間戳的示例如…

Maven最佳實踐

盡管Maven提供了“配置之上的約定”解決方案&#xff0c;但是仍然有足夠多的必要配置引起嚴重的頭痛。 在這篇文章中&#xff0c;我將與您分享一些最佳實踐&#xff0c;以簡化對POM文件的維護。 請勿使用已棄用的引用&#xff0c;例如$ {artifactId}或$ {pom.artifactId}。 使用…

51Nod - 1381 硬幣游戲

51Nod - 1381 硬幣游戲 有一個簡單但是很有趣的游戲。在這個游戲中有一個硬幣還有一張桌子&#xff0c;這張桌子上有很多平行線&#xff08;如下圖所示&#xff09;。兩條相鄰平行線之間的距離是1&#xff0c;硬幣的半徑是R&#xff0c;然后我們來拋硬幣到桌子上&#xff0c;拋…

Android中Activity和Fragment之間的通信

Android中Activity和Fragment之間的通信 Fragment啟動Activity傳數據到Fragment 舉例&#xff1a;城市選擇列表。一個Fragment啟動Activity&#xff0c;Activity再把城市選擇數據回傳到Fragment中。Fragment中方法iv_city.setOnClickListener(new View.OnClickListener() {Ove…

NoSQLUnit 0.3.0發布

介紹 單元測試是一種驗證應用程序中可測試的最小部分的方法。 單元測試必須遵循FIRST規則&#xff1b; 這些是快速&#xff0c;隔離&#xff0c;可重復&#xff0c;自我驗證和及時的。 考慮到沒有持久層&#xff08;典型的關系數據庫或新的NoSQL數據庫&#xff09;的JEE應用程…

proftpd java_Proftpd:編譯安裝

下載 proftpd# wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.5a.tar.gz# wget https://github.com/proftpd/proftpd/archive/v1.3.5a.tar.gz# yum -y install gcc openssl-devel# ./configure --prefix/usr/local/proftpd/ \--sysconfdir/usr/local/proftpd/ \--ena…

javascript 相關小的知識點集合

本文主要是列出一些javascript 相關的&#xff0c;不限于javascript的&#xff0c;容易記錯或者遺忘的小知識&#xff0c;小技巧。 1、javascript中的false 在 JavaScript&#xff0c;常見的 false 值&#xff1a; 0, 0, 0, -0, false, ,null,undefined,NaN 要注意空數組([])和…

AOS – 另外一個獨特的頁面滾動動畫庫(CSS3)

AOS 是一個用于在頁面滾動的時候呈現元素動畫的工具庫&#xff0c;你可能會覺得它和 WOWJS 一樣&#xff0c;的確他們效果是類似的。但是AOS是 CSS3 動畫驅動的庫&#xff0c;當你滾動頁面的時候能讓元素動起來&#xff0c;當頁面滾回頂部的時候&#xff0c;元素能夠回到前一個…

關于Java包

我希望我們都同意&#xff0c;方法和類應該很小&#xff0c;并且只有很少的依賴關系。 這種觀點被廣泛接受&#xff0c;而對“小”的解釋則各不相同。 關于這一點有很多文獻。 但是包裹呢&#xff1f; 有些人將包視為名稱空間。 因此&#xff0c;包只是允許您為類重用名稱的東西…

python中打開文件時只允許寫入的模式是_詳解python中各種文件打開模式

在python中&#xff0c;總的來說有三種大的模式打開文件,分別是:a, w, r當以a模式打開時&#xff0c;只能寫文件&#xff0c;而且是在文件末尾添加內容。當以a模式打開時&#xff0c;可以寫文件&#xff0c;也可讀文件&#xff0c;可是在讀文件的時候&#xff0c;會發現讀出來的…

KVM 基本硬件容量擴容

在工作當中如果虛擬機的容量不夠使用 如何添加呢&#xff1f; CPU添加 cpu添加有兩種方式&#xff1a; 1 創建虛擬機的時候可以添加 # virt-install --help | grep cpu--vcpusVCPUS Number of vcpus to configure for your guest. Ex:--vcpus 5--vcpus 5,maxcpus10--vcpu…

JavaFX 2.0 Hello World

在討論示例本身之前&#xff0c;我想向您展示如何在NetBeans中創建JavaFX應用程序。 &#xff08;如果尚未安裝JavaFX和NetBeans&#xff0c;請參閱我以前的文章《 安裝JavaFX 2.0和NetBeans 7.7.1》 &#xff09;單擊“文件”菜單中的“新建項目”以打開項目向導。 然后選擇“…

java 線程強制停止線程_java多線程之停止線程

在多線程開發中停止線程是非常重要的技術點。停止線程在Java語言中并不像break語句那樣干脆。須要一些技巧性的處理。一、 異常法採用異常法來停止一個線程。首先我們須要了解一下兩個方法的使用方法&#xff1a;1、interrupt()方法public class MyThread extends Thread{Over…

Android 上下文菜單(Context Menu)

一、概述 Android中&#xff0c;上下文菜單是通過onLongClick(...)事件訪問的。在事件觸發后顯示菜單項。 在使用上下文菜單時&#xff0c;通常在onCreate(...)方法中&#xff0c;先行注冊上下文菜單。在實現onCreateContextMenu(...)方法和onContextItemSelected(...)方法。 注…

RGB顏色空間alpha混合的方法

http://blog.csdn.net/xhhjin/article/details/6444782http://blog.csdn.net/xhhjin/article/details/6445460http://www.cnblogs.com/graphics/archive/2012/08/23/2643086.htmlhttp://www.oschina.net/code/snippet_1425046_27446 轉載于:https://www.cnblogs.com/eustoma/p/…

Java怪異實踐

總覽 Java中有許多實踐使我感到困惑。 這里只是一些。 使用-Xmx和-Xms 選項-Xmx廣泛用于設置最大內存大小。 如Java HotSpot VM Options中所述&#xff0c;以-X開頭的選項是非標準的&#xff08;不保證在所有VM實現中均受支持&#xff09;&#xff0c;并且在以后的JDK發行版中…

saml java實現_java-saml

軟件簡介java-saml 是 Java 的 SAML 開發包。Maven&#xff1a;com.oneloginjava-saml2.4.0示例代碼&#xff1a;Map samlData new HashMap<>();samlData.put("onelogin.saml2.sp.entityid", "http://localhost:8080/java-saml-tookit-jspsample/metadat…

雙系統Ubuntu分區擴容過程記錄

本人電腦上安裝了Win10 Ubuntu 12.04雙系統。前段時間因為在Ubuntu上做項目要安裝一個比較大的軟件&#xff0c;導致Ubuntu根分區的空間不夠了。于是&#xff0c;從硬盤又分出來一部分空間&#xff0c;分給Ubuntu。于是有了這篇Ubuntu擴容過程記錄&#xff0c;也可以當作是一篇…

使用MongoDB的MapReduce

MapReduce是Google在2004年推出的一種軟件框架&#xff0c;用于支持對計算機集群中的大數據集進行分布式計算。 您可以從此處閱讀有關MapReduce的信息 。 MongoDB是用C 編寫的面向開源文檔的NoSQL數據庫系統。 您可以從此處閱讀有關MongoDB的更多信息。 1.安裝MangoDB。 請遵…

java epson指令集_EPSON機械手 SPEL+語言指令集

下面是全部指令的簡明列表&#xff0c;放在這里方便參考。之后重要的指令&#xff0c;勇哥要拿出來單獨學習。系統管理相關命令Reset 將控制器重置為初始狀態。SysConfig 顯示系統設置參數。SysErr 返回最新的錯誤狀態或警告狀態。Date 顯示日期。Time 顯示時間。Date$ 以字符串…