1. 程式人生 > >HDU1599杭州旅遊

HDU1599杭州旅遊

uid offset puts tchar lib i++ urn pos str

P2457 - 【HDU1599】杭州旅遊

Description

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

Input

第一行是 2 個整數 N 和 M( N <= 800, M <= 600000), 代表景區的個數和道路的條數。
接下來的 M 行裏, 每行包括 3 個整數 a,b,c.代表 a 和 b 之間有一條通路, 並且需要花費 c 元(c <= 10000)。

Output

如果能找到這樣一條路線的話, 輸出花費的最小值。 如果找不到的話, 輸出 "It‘s impossible." (沒有雙引號)

Sample Input

輸入樣例1:
3 3
1 2 1
2 3 1
1 3 1

輸入樣例2:
3 3
1 2 1
1 2 3
2 3 1

Sample Output

輸出樣例1:
3

輸出樣例2:
It‘s impossible.

Hint

【數據範圍】
對於 40%的數據: 2 <= n < 100, m<=10000
對於 100%的數據: n <= 800, m<=600000

Source

最小環

最小環,用Floyed即可

 1 /* QYP kuai wo dai ma*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<iomanip>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<cstdio>
 8
#include<queue> 9 #include<ctime> 10 #include<cmath> 11 #include<stack> 12 #include<map> 13 #include<set> 14 #define rep(i,a,b) for(register int i=a;i<=b;i++) 15 #define ll long long 16 #define re register 17 #define inf 1<<29 18 using namespace std; 19 const int N=810,M=600010; 20 int n,m,ans=inf; 21 int d[N][N],g[N][N]; 22 inline int gi() { 23 re int res=0; 24 char ch=getchar(); 25 while(ch<0||ch>9) ch=getchar(); 26 while(ch>=0&&ch<=9) res=res*10+ch-0,ch=getchar(); 27 return res; 28 } 29 void Floyed() { 30 rep(k,1,n) { 31 rep(i,1,k-1) 32 rep(j,i+1,k-1) 33 ans=min(ans,d[i][j]+g[i][k]+g[k][j]); 34 rep(i,1,n) 35 rep(j,1,n) 36 d[i][j]=min(d[i][j],d[i][k]+d[k][j]); 37 } 38 } 39 int main() { 40 freopen("zdlcs.in","r",stdin); 41 freopen("zdlcs.out","w",stdout); 42 n=gi(),m=gi(); 43 memset(g,127/3,sizeof(g)); 44 rep(i,1,n) 45 rep(j,1,n) 46 if(i!=j) 47 d[i][j]=inf; 48 rep(i,1,m){ 49 re int u=gi(),v=gi(),w=gi(); 50 if(g[u][v]<=w) continue; 51 g[u][v]=g[v][u]=w; 52 d[u][v]=d[v][u]=w; 53 } 54 Floyed(); 55 if(ans==inf) puts("It‘s impossible."); 56 else 57 printf("%d",ans); 58 }

HDU1599杭州旅遊