vijos 觀光旅遊 最小環fl 呆詳看

2022-04-30 02:54:07 字數 2147 閱讀 9235

湖南師大附中成為百年名校之後,每年要接待大批的遊客前來參觀。學校認為大力發展旅遊業,可以帶來一筆可觀的收入。

學校裡面有n個景點。兩個景點之間可能直接有道路相連,用dist[i,j]表示它的長度;否則它們之間沒有直接的道路相連。這裡所說的道路是沒有規定方向的,也就是說,如果從i到j有直接的道路,那麼從j到i也有,並且長度與之相等。學校規定:每個遊客的旅遊線路只能是乙個迴路(好霸道的規定)。也就是說,遊客可以任取乙個景點出發,依次經過若干個景點,最終回到起點。一天,xiaomengxian決定到湖南師大附中旅遊。由於他實在已經很累了,於是他決定盡量少走一些路。於是他想請你——乙個優秀的程式設計師——幫他求出最優的路線。怎麼樣,不是很難吧?(摘自《鬱悶的出納員》)

對於每組資料:

第一行有兩個正整數n,m,分別表示學校的景點個數和有多少對景點之間直接有邊相連。(n<=100,m<=10000)

以下m行,每行三個正整數,分別表示一條道路的兩端的編號,以及這條道路的長度。

對於每組資料,輸出一行:

如果該迴路存在,則輸出乙個正整數,表示該迴路的總長度;否則輸出「no solution.」(不要輸出引號)

5 7

1 4 1

1 3 300

3 1 10

1 2 16

2 3 100

2 5 15

5 3 20

4 31 2 10

1 3 20

1 4 30

61

no solution.

各個測試點1s

by 

典型的最小環問題

因為n很小可以直接floyd求最小環

注意最小環ans更新的位置

每次列舉k為下家更新點

應該先嘗試更新ans再更新i,j之間的最短路

我們用g[i][j]來記錄i,j之間最短路徑

而w[i][j]用來儲存i,j之間的原始路徑長度

因為我們知道i,j要構成乙個最小環

肯定要有兩條路可走

1.直接從i到j。

2.從i經過某個中途點k到達j

即對於每乙個k 我們先嘗試從這個k點對於所有的i,j點能不能得到最小環

然後我們再用這個k點嘗試更新路徑

該演算法的證明:

乙個環中的最大結點為k(編號最大),與其相連的兩個點為i,j ,

這個環的最短長度為: g[i][k] + g[k][j] + i到j的路徑中所有結點編號都不大於k的最短路徑長度,

根據floyd的原理,在最外層迴圈做乙個k-1次之後,

g[i][j] 則代表了i到j的路徑中所有結點的編號都不大於k的最短路徑。

所以我們列舉的i,j要有

1<=i

再換一種說法吧

比普通floyd多出來的部分,主要利用到的原理是當處理到k時,

所有以1 到k - 1為中間結點的最短路徑都已經確定,

則這時候的環為(i到j(1 < i, j <= k - 1)的最短路徑) + 邊(i, k) + 邊(k, j)

遍歷所有的i, j找到上述式子的最小值即位k下的最小代價環  

*//*

路徑的求法:

用乙個pre[i][j]記錄j前面的乙個頂點, 初始化為i,當出現需要更新的時候則將pre[i][j] = pre[k][j];

若i== j的時候則表示找全了路徑,最後將k點加入路徑中

核心**:

while(i != j)

path[len++] = i;

}

#include #include 

#include

#include

using

namespace

std;

const

int inf=1e8;

int w[102][102],g[102][102

];int

n,e;

void

init()

}void

work()

if(ans==inf)

printf(

"no solution.\n");

else

printf(

"%d\n

",ans);

}int

main()

}

觀光旅遊(最小環問題)

在桑給巴爾島的adelton城鎮上有乙個旅遊機構。它們決定在提供許多的其它吸引之外,再向客人們提供旅遊本鎮的服務。為了從提供的吸引服務中盡可能地獲利,這個旅遊機構接收了乙個精明決定 在相同的起點與終點之間找出一最短路線。你的任務是編寫一條程式來找類似的的一條路線。在這個鎮上,有n個十字路口 編號1至...

觀光旅遊 Floyed 最小環

time limit 20000ms memory limit 65536k total submit 292 accepted 144 case time limit 2000ms description 在桑給巴爾島的ade lton adelton adelto n城鎮上有乙個旅遊機構。它們決...

vijosP1046 觀光旅遊(最小環)

vijosp1046 觀光旅遊 思路 floyd求解最小環。1 include2 using namespace std 34 const int maxn 100 10 5 const int inf 1e8 6int f maxn maxn dist maxn maxn 7int n,m,min...