Vijos P1423 最佳路线
Vijos P1423
題目描述
年久失修的賽道令國際汽聯十分不滿。汽聯命令主辦方立即對賽道進行調整,否則將取消其主辦權。主辦方當然必須馬上開始行動。
賽道測評人員經過了三天三夜的數據采集,選出了若干可以使用的道路和各道路行駛所需的時間。這些道路包括若干直道和彎道,每個直道連接兩個不同的彎道且為單向,兩個彎道之間可能有多條直道,通過直道和彎道都需要一定的時間。主辦方打算在這些可用道路中選出一部分作為賽道。賽道是由直道和彎道交替組成的一圈,賽道可多次經過同一條彎道,因為主辦方可以通過架設立交橋的方法避免撞車。為了使比賽更加精彩,主辦方希望選擇一條單圈時間最短的賽道,由于觀眾席的位置在彎道1,所以賽道必須經過彎道1(賽道至少要包含一條直道)。
輸入格式
第一行是兩個整數n,m(1<=n<=200,1<=m<=100000),分別表示彎道數和直道數。接下來n行,第i行是一個整數ai(1<=ai<=1000),表示通過第i個彎道所消耗的時間。接下來m行,第j行是三個整數xj,yj,bj(1<=xj,yj<=n,1<=bj<=1000),表示從彎道xj到彎道yj有一條單向直道,且通過該直道所消耗的時間為bj。
輸出格式
一個整數s,表示單圈時間最短的賽道的單圈時間,若無解則輸出-1。
樣例輸入1
3 6
1
1
2
1 2 3
2 3 5
3 1 1
3 2 1
2 1 10
1 3 15
樣例輸出1
13
樣例輸入2
3 4
1
1
2
1 2 4
1 3 5
2 3 5
3 2 10
樣例輸出2
-1
這道題是一個十分標準的弗洛伊德(floyd)題目,只需要將彎道作為點即可,而彎道的權值放到初度入度均能解決問題。
為了方便大家理解,提供圖片如下(我將權值放到了出度里)
樣例輸入1
我們可以看到,最短環路為1->2->->3->1,值為13;
樣例輸入2
我們可以看到,并沒有一條經過一的回路,所以無解。
C++實現方法
#include <stdio.h> #include <string.h> int a[210][210],b[210]; int min(int a,int b) {if(a<b) return a;else return b; } int n,m; int main() {memset(a,0x3f,sizeof(a));scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&b[i]);for(int i=1;i<=m;i++){int c,d,e;scanf("%d%d%d",&c,&d,&e);if(a[c][d]==0x3f3f3f3f) a[c][d]=b[c]+e;else if(a[c][d]>b[c]+e) a[c][d]=b[c]+e;}for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)a[i][j]=min(a[i][k]+a[k][j],a[i][j]);if(a[1][1]<0x3f3f3f3f)printf("%d",a[1][1]);else printf("-1");return 0; }總結
以上是生活随笔為你收集整理的Vijos P1423 最佳路线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Unix网络编程》环境搭建
- 下一篇: vijos1697——平面几何