1. 程式人生 > >Floyd演算法求圖最小環

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 弗洛伊德基本思想 弗洛伊德演算法作為求最短路徑的經典演算法,其演算法實現相比迪傑斯特拉等演算法是非常優雅的,可讀性和理解都非常好。 基本思想: 弗洛伊德演算法定義了兩個二維