hdu 1599 find the mincost route 最小环

题目链接:HDU - 1599

杭州有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.".
 
题意描述:中文题,如上所述。
算法分析:用Floyd求解最小环的问题。有关最小环的定义和求解方法,大家可以去这个博客学习。
 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<cstdlib>

 5 #include<cmath>

 6 #include<algorithm>

 7 #define inf 0x7fffffff

 8 using namespace std;

 9 const int maxn=100+10;

10 

11 int n,m;

12 int dist[maxn][maxn],edge[maxn][maxn];

13 

14 void floyd()

15 {

16     int ans=1000100;

17     for (int i=1 ;i<=n ;i++)

18     {

19         for (int j=1 ;j<=n ;j++)

20             dist[i][j]=edge[i][j];

21     }

22     for (int k=1 ;k<=n ;k++)

23     {

24         for (int i=1 ;i<k ;i++)

25         {

26             for (int j=i+1 ;j<k ;j++)

27             {

28                 if (dist[j][i]+edge[i][k]+edge[k][j]<1000100)

29                     ans=min(ans,dist[j][i]+edge[i][k]+edge[k][j]);

30             }

31         }

32         for (int i=1 ;i<=n ;i++)

33         {

34             for (int j=1 ;j<=n ;j++)

35             {

36                 if (dist[i][j]>dist[i][k]+dist[k][j])

37                     dist[i][j]=dist[i][k]+dist[k][j];

38             }

39         }

40     }

41     if (ans==1000100) printf("It's impossible.\n");

42     else printf("%d\n",ans);

43 }

44 

45 int main()

46 {

47     while (scanf("%d%d",&n,&m)!=EOF)

48     {

49         for (int i=1 ;i<=n ;i++)

50         {

51             for (int j=1 ;j<=n ;j++)

52                 edge[i][j]=1000100;

53             edge[i][i]=0;

54         }

55         int x,y,cost;

56         for (int i=0 ;i<m ;i++)

57         {

58             scanf("%d%d%d",&x,&y,&cost);

59             if (edge[x][y]>cost) edge[x][y]=edge[y][x]=cost;

60         }

61         floyd();

62     }

63     return 0;

64 }

 

你可能感兴趣的:(route)