Floyd演算法求圖最小環
觀光旅遊
Time Limit:1000MS Memory Limit:65536K
Total Submit:1 Accepted:0
Description
背景 Background
湖南師大附中成為百年名校之後,每年要接待大批的遊客前來參觀。學校認為大力發展旅遊業,可以帶來一筆可觀的收入。
描述 Description
學校裡面有N個景點。兩個景點之間可能直接有道路相連,用Dist[I,J]表示它的長度;否則它們之間沒有直接的道路相連。這裡所說的道路是沒有規定方向的,也就是說,如果從I到J有直接的道路,那麼從J到I也有,並且長度與之相等。學校規定:每個遊客的旅遊線路只能是一個迴路(好霸道的規定)。也就是說,遊客可以任取一個景點出發,依次經過若干個景點,最終回到起點。一天,Xiaomengxian決定到湖南師大附中旅遊。由於他實在已經很累了,於是他決定儘量少走一些路。於是他想請你——一個優秀的程式設計師——幫他求出最優的路線。怎麼樣,不是很難吧?(摘自《鬱悶的出納員》)
Input
第一行有兩個正整數N,M,分別表示學校的景點個數和有多少對景點之間直接有邊相連。(N<=100,M<=10000)
以下M行,每行三個正整數,分別表示一條道路的兩端的編號,以及這條道路的長度。
Output
輸出一行:
如果該回路存在,則輸出一個正整數,表示該回路的總長度;否則輸出“No solution.”(不要輸出引號)
Sample Input
5 6
1 4 1
3 1 10
1 2 16
2 3 100
2 5 15
5 3 20
Sample Output
61
最小 環問題
一個環中的最大節點為k(編號最大),與它相連的兩點i,j,這個環的最短長度為g[i][k]+g[k][j]+i到j的路徑中,所有編號都小於k的最短路徑長度。
根據floyd原理,在最外層迴圈做了k-1次之後,dis[i][j]就代表了i到j路徑中所有節點編號小於k的最短路徑。
#include<bits/stdc++.h> using namespace std; int dis[111][111],e[111][111]; int n,m; int main() { int a,b,c; while(cin>>n>>m){ memset(dis,0x3f,sizeof(dis)); memset(e,0x3f,sizeof(e)); for(int i=0;i<m;i++){ cin>>a>>b>>c; e[a][b]=c; e[b][a]=c; dis[a][b]=c; dis[b][a]=c; } int ans=0x3f3f3f3f; for(int k=1;k<=n;k++){ for(int i=1;i<=k-1;i++) { for(int j=i+1;j<=k-1;j++){ ans=min(ans,dis[i][j]+e[i][k]+e[k][j]); } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++){ dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } } if(ans==0x3f3f3f3f) cout<<"沒有最小環"<<endl; else{ cout<<"最小環長度為:"<<ans<<endl; } } }
相關推薦
Floyd演算法求圖最小環
觀光旅遊Time Limit:1000MS Memory Limit:65536K Total Submit:1 Accepted:0Description背景 Background 湖南師大附中
Vijos - 最佳路線(Floyd+有向圖最小環)
https://vijos.org/p/1423 題目描述 年久失修的賽道令國際汽聯十分不滿。汽聯命令主辦方立即對賽道進行調整,否則將取消其主辦權。主辦方當然必須馬上開始行動。 賽道測評人員經過了三天三夜的資料採集,選出了若干可以使用的道路和各道路行駛所需的時間。這些道路包括若干直道
floyd求無向圖最小環——poj1734
給定一個無向圖,求出圖中由 3個及以上個點構成的環的邊權和 中的最小值。(一個點不能遍歷多次)在floyd時,先迴圈k,然後是i和j,你會發現在每次進入一個新的k迴圈時,每一個d(i,j)都儲存著從i到j,只經歷了編號不超過k-1的節點的最短路、於是,min{d(i,j)+
藍書(演算法競賽進階指南)刷題記錄——POJ1734 Sightseeing trip(無向圖最小環)
題目:poj1734. 題目大意:給定一張無向圖,求這張無向圖邊權和最小的節點大於3個的環,若有解輸出任意一個方案,否則輸出“No solution.”. 這就是一個較為簡單的floyd應用. 我們可以先把floyd模板寫下來看看floyd有什麼特殊的性質: void floyd
洛谷P2661 資訊傳遞(帶權並查集求有向圖最小環)
題目描述有n個同學(編號為1到n)正在玩一個資訊傳遞的遊戲。在遊戲裡每人都有一個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為Ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件(注意:可能有人
vijos1423最佳路線——有向圖最小環模板
題目:vijos1423. 題目大意:給定一些單向直道與彎道,並且給出每條單向直道連線哪兩條彎道,讓你求出經過彎道1的邊權最小的環. 這道題我們可以將彎道看成點,將直道看成有向邊,那麼原問題其實就是求經過點1的最小環. 解決最小環問題一般用的是floyd演算法或dijkstra演算法
遺傳演算法求多項式最小值(C語言)
問題:在下面的程式中將要運用遺傳演算法對一個多項式求最小值: y=x^6-10x^5-26x^4+344x^3+193x^2-1846x-1680 要求在(-8,8)間尋找使表示式達到最小的x,誤差為0.001。 問題分析:
poj1734 無向圖最小環
要求對floyd演算法有一定的理解。 有一個神奇的地方:路徑是邊做邊更新的,防止了出現重複的點。(在不同的k時更新的路徑,中間點g[i][j]是會變化的) #include<bits/stdc++.h> using namespace std; #define
無向圖有向圖最小環
floyd求。 for(int k=1;k<=n;k++) { for(int i=1;i<k;i++) for(int j=1;j<k;j++) ans=min(ans,dis[i][k]+dis[k][j]+map1[j][i]) for
12.3日+佛洛依德處理無向圖最小環+dijkstra處理有向圖最小環
昨天的資料庫考試,題目本身都簡單的,但是感覺時間有點緊張,可能和自己有點墨跡有關。題目不怕不會做,就怕讀錯題,上了大學養成了考試“做完一遍要檢查的壞習慣”,這次沒時間檢查,所以有種做的不好的感覺。 弗洛伊德演算法是運用的動態規劃的思
HDU-1599-find the mincost route【最短路】【無向圖最小環】
find the mincost route Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4341
【USACO4.1.3】籬笆迴路 無向圖最小環
題目意思就是讓你求無向圖最小環,但是給資料的方式非常噁心。 我的用並查集+暴力的方式…… 先給每個邊的頂點標號,然後…… 把A能到B,B也能到A的邊的點,給併為一個點…… 然後floyd求最小環。 floyd最小環我自己還不是非常理解…… 但是先用著,上課再想
【杭電oj1599】find the mincost route無向圖最小環
find the mincost route Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s
Floyd演算法求圖的傳遞閉包
Floyd演算法的一個應用吧 /* 設R是非空集合上的關係,R的傳遞閉包是A上的關係R',使得R'滿足以下條件: 1)、R'是傳遞的 2)、R是R'的子集 3)、對A上的任何包含R的傳遞關係R'',有 R'是R''的子集 下面是用Folyd-Warshall演算法來解 */
應用遺傳演算法求函式最小值
1、遺傳演算法概論 遺傳演算法(GA)可能是最早開發出來的模擬生物遺傳系統的演算法模型。它首先由Fraser提出,後來有Bremermann和Reed等人 再次提出。最後,Holland對遺傳演算法做了大量工作並使之推廣,因此被認為是遺傳演算法的奠基人。遺傳
演算法 圖中求最小環路徑 最小環個數 最大平均環 求簡單無向圖中環的個數
最小環問題:求個圖中環路徑代價最小的迴路。 如何求最小環?假如有 路徑1->3->2,如果此時已經知道2-1的最短路徑就好了。 回想下floyed的更新過程,就會發現更新第k次時,比k小的點之間都是最短距離的(要是點是聯通的話)。所以給出解法:第k次更新圖時
poj 1734 Floyd算求有向圖的最小環
題意:旅遊公司要開發一條新的路線 , 要求這是一個總路程儘可能短的環 , 並且不能只含兩個城市 , 除開起點外 , 不能重複走之前走過的城市 , 輸出這條路線? Floyd演算法求最小環 程式碼: //用floyd演算法 , 求有向圖的最小環 #include #include #include #i
floyd求最小環
int inf cst 而是 不知道 為什麽 class include con hdu1599 floyd求最小環 其實floyd求最小環就相當於找出一個一條只包括1到k-1中節點的路徑,然後把這個路徑與k這個節點相連。這樣是正確的原因是,最小環中一定有一個最大節點k,當
弗洛伊德Floyd求最小環
lse urn view ide 不存在 eps 圖片 none 枚舉 模板: #include<bits/stdc++.h> using namespace std; const int MAXN = 110; const int IN
弗洛伊德(Floyd)演算法求圖的最短路徑
https://blog.csdn.net/jeffleo/article/details/53349825 弗洛伊德基本思想 弗洛伊德演算法作為求最短路徑的經典演算法,其演算法實現相比迪傑斯特拉等演算法是非常優雅的,可讀性和理解都非常好。 基本思想: 弗洛伊德演算法定義了兩個二維