1. 程式人生 > >hdu 1599 find the mincost route

hdu 1599 find the mincost route

std word esp func space hid floyd tracking oss

pid=1599">click here ~~

                               ***find the mincost route***
Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3328    Accepted Submission(s): 1350



Problem Description

杭州有N個景區。景區之間有一些雙向的路來連接,如今8600想找一條旅遊路線,這個路線從A點出發而且最後回到A
點,假設經過的路線為V1,V2,....VK,V1,那麽必須滿足K>2,就是說至除了出發點以外至少要經過2個其它不同的景區。而且不能反復經過同一個景區。如今8600須要你幫他找一條這種路線。而且花費越少越好。

Input 第一行是2個整數N和M(N <= 100, M <= 1000),代表景區的個數和道路的條數。 接下來的M行裏,每行包含3個整數a,b,c.代表a和b之間有一條通路。而且須要花費c元(c <= 100)。 Output 對於每個測試實例,假設能找到這樣一條路線的話,輸出花費的最小值。

假設找不到的話,輸出"It‘s impossible.". Sample Input 3

3 1 2 1 2 3 1 1 3 1 3 3 1 2 1 1 2 3 2 3 1 Sample Output 3 It‘s impossible.

題目大意: 這是中文題。
解題思路:最小生成樹啊。這是一個純的Floyd算法的最短路徑:

具體我在代碼裏給出了具體的解釋。上代碼:

/*
2015 - 8 - 14 下午
Author: ITAK

今日的我要超越昨日的我。明日的我要勝過今日的我,
以創作出更好的代碼為目標,不斷地超越自己。
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm> using namespace std; const int Max = 0xfffffff; const int maxn = 110; int dis[maxn][maxn], map[maxn][maxn]; int m, n, ans; //n代表結點個數 //m代表有幾條邊 void Init() { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) dis[i][j] = Max; } //Floyd算法 /* Floyd算法的基本思想例如以下: 從隨意節點A到隨意節點B的最短路徑不外乎2種可能。 1是直接從A到B, 2是從A經過若幹個節點X到B。

所以,我們假設Dis(AB)為節點A到節點B的最短路徑的距離, 對於每個節點X。 我們檢查Dis(AX) + Dis(XB) < Dis(AB)是否成立, 假設成立,證明從A到X再到B的路徑比A直接到B的路徑短, 我們便設置Dis(AB) = Dis(AX) + Dis(XB), 這樣一來,當我們遍歷全然部節點X。 Dis(AB)中記錄的便是A到B的最短路徑的距離。 */ void Floyd() { int i, j, k; ans = Max; for(k=1; k<=n; k++) { //最小負環的判定 for(i=1; i<k; i++) for(j=i+1; j<k; j++) if(ans > dis[i][j]+map[i][k]+map[k][j]) ans = dis[i][j]+map[i][k]+map[k][j]; for(i=1; i<=n; i++) for(j=1; j<=n; j++) if(dis[i][j] > dis[i][k]+dis[k][j]) //找到更短路徑 dis[i][j] = dis[i][k]+dis[k][j]; } } int main() { while(cin>>n>>m) { Init(); int u, v, w; while(m--) { cin>>u>>v>>w; if(w < dis[u][v]) { dis[u][v] = w; dis[v][u] = w; } } for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) map[i][j] = dis[i][j]; Floyd(); if(ans == Max) puts("It‘s impossible."); else cout<<ans<<endl; } return 0; }

hdu 1599 find the mincost route