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)。
接下来的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.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }