hdu 1599 find the mincost route(floyd 最小环)

网友投稿 240 2022-08-31

hdu 1599 find the mincost route(floyd 最小环)

题目:​​the mincost route​​

Time Limit: 2000MS

 

Memory Limit: 32768KB

 

64bit IO Format: %I64d & %I64u

​​Submit​​​ ​​Status​​

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.

因为道路是双向的,所以是无向图。N<=100,可以用是O(n^3)的floyd算法求解最小环。

#include #include #include #include using namespace std;const int maxn=105,INF=0x3f3f3f3f;int pre[maxn][maxn],map[maxn][maxn],dis[maxn][maxn];int res,n,m;void init(){ res=INF; memset(map,0x3f,sizeof(map)); for(int i=1;i<=n;i++) map[i][i]=0;}void floyd(){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ dis[i][j]=map[i][j]; pre[i][j]=i; } } for(int k=1;k<=n;k++){ /*for(int i=1;i<=n;i++){ // 可以用这种circle更新方法,但是后者更快 for(int j=1;j<=n;j++){ if(i!=j&&j!=k&&i!=k&&dis[i][j]!=INF&&map[k][j]!=INF&&map[i][k]!=INF){ res=min(dis[i][j]+map[i][k]+map[k][j],res); } } }*/ for(int i=1;i>n>>m){ init(); for(int i=0;ic){ // 更新 map[a][b]=c; map[b][a]=c; } } floyd(); if(res==INF) puts("It's impossible."); else { printf("%d\n",res); } } return 0;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:hdu 1878 欧拉回路(简单欧拉回路)
下一篇:不创新,无未来,这里不仅有营销新玩法,更有营销新机会!(()让精准营销成为可能)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~