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
",ans);
62         else printf("It's impossible.
");
63 
64     }
65     return 0;
66 }
View Code
原文地址:https://www.cnblogs.com/LK1994/p/3355729.html