find the mincost route(floyd变形 无向图最小环)

Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1630    Accepted Submission(s): 664


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.
 
 1 #include<stdio.h>

 2 #include<string.h>

 3 #include<algorithm>

 4 using namespace std;

 5 

 6 const int INF = 100000000;

 7 const int N = 110;

 8 int n,m;

 9 int map[N][N],dis[N][N];

10 int ans;

11 

12 void floyd()

13 {

14     int i,j,k;

15     ans = INF;

16     for(k = 1; k <= n; k++)

17     {

18         for(i = 1; i < k; i++)

19         {

20             for(j = i+1; j < k; j++)

21             {

22                 ans = min(ans,dis[i][j]+map[j][k]+map[k][i]);

23             }

24         }

25 

26         for(i = 1; i <= n; i++)

27         {

28             for(j = 1; j <= n; j++)

29             {

30                 if(dis[i][j] > (dis[i][k]+dis[k][j]))

31                     dis[i][j] = dis[i][k]+dis[k][j];

32             }

33         }

34     }

35 }

36 int main()

37 {

38     while(~scanf("%d %d",&n,&m))

39     {

40         for(int i = 0; i <= n; i++)

41         {

42             for(int j = 0; j <= n; j++)

43             {

44                 map[i][j] = INF;

45                 dis[i][j] = INF;

46             }

47         }

48 

49         while(m--)

50         {

51             int u,v,w;

52             scanf("%d %d %d",&u,&v,&w);

53             if(map[u][v] > w)

54             {

55                 map[u][v] = map[v][u] = w;

56                 dis[u][v] = dis[v][u] = w;

57             }

58         }

59         floyd();

60         if(ans < INF)

61             printf("%d\n",ans);

62         else printf("It's impossible.\n");

63 

64     }

65     return 0;

66 }
View Code

 

你可能感兴趣的:(route)