HDU1599 find the mincost route 無向圖最小環

來源:互聯網
上載者:User

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1599

 

題目大意:就是說8600要去旅行,給你若干個景區,8600想要找到一條路線,比如從A出發最終回到A,並且除了出發點外其餘的景區不會不會重複走一遍,如V1>V2>V3>....>Vn,並且景區數不少於3.現在要求你找出一條花費最少的路徑。其中資料N,M為景區數,道路數。a,b,c表示從a到b需要花費c元。

 

解法:就是利用Floyd演算法擴充求出無向圖的最小環。

 

注意:無向圖的最小環和有向圖的最小環是不一樣的,在有向圖中2個頂點就能形成最小環,而在無向圖中至少要3個頂點才能組成最小環。所以我們為了求出無向圖的最小環採用的方法就是:枚舉最大環的連接點,更新環的權重。與普通Floyd不同的部分主要利用到的原理是當處理到k時,所有以1 到k - 1為中間結點的最短路徑都已經確定,則這時候的環為(i到j(1 < i, j <= k - 1)的最短路徑) + 邊(i, k) + 邊(k, j)遍曆所有的i, j找到上述式子的最小值即為k下的最小代價環

 

本題主要是用Floyd演算法擴充求無向圖最小環的模版,代碼如下:

 

#include<iostream>using namespace std;#define INF 100000000#define min(a,b) a<b?a:b#define MAX 105int N,M,a,b,c;int map[MAX][MAX],A[MAX][MAX];int Floyd(){int i,j,k;int min=INF;for(k=1;k<=N;k++)//最短路徑外一點將最短路首尾連結,那麼就得到一個最小環{for(i=1;i<k;i++){for(j=i+1;j<k;j++){//求最小環不能用兩點間最短路鬆弛,因為(i,k)之間的最短路,(k,j)之間的最短路可能有重合的部分//所以map[][]其實是不更新的,這裡和單純的floyd最短路不一樣//A[i][j]儲存的是 i 到 j 的最短路權值和int tmp=A[i][j]+map[i][k]+map[k][j];if(tmp<min)min=tmp;}}for(i=1;i<=N;i++){for(j=1;j<=N;j++){if(A[i][j]>A[i][k]+A[k][j])A[i][j]=A[i][k]+A[k][j];//A[][]儲存兩點間最短距離}}}return min;}int main(){int i,j;while(~scanf("%d%d",&N,&M)){for(i=1;i<=N;i++){for(j=1;j<=N;j++)map[i][j]=A[i][j]=INF;}for(i=1;i<=M;i++){scanf("%d%d%d",&a,&b,&c);    map[a][b]=map[b][a]=A[a][b]=A[b][a]=min(map[a][b],c);}int s=Floyd();if(s==INF)printf("It's impossible.\n");elseprintf("%d\n",s);}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.