题干:

杭州有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.

解题报告:

模板就是了。。注释下面有。不解释了、、(其实还有个更朴素的做法用Dijkstra也可以求最小环)(ps:最小生成树是不是也可以?)

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
ll dis[505][505];//Floyd更新后数据
ll maze[505][505];//原始数据
const ll INF = 0x3f3f3f3f3f3f;
int n,m;
ll floyd() {ll res = INF;for(int k = 1; k<=n; k++) {for(int i = 1; i<k; i++) {for(int j = i+1; j<k; j++) {res = min(res,maze[i][k] + maze[k][j] + dis[i][j]);}}for(int i = 1; i<=n; i++) {for(int j = 1; j<=n; j++) {dis[i][j] = min(dis[i][j] , dis[i][k] + dis[k][j]);}}} return res;
}int main()
{ll w;while(cin>>n>>m) {for(int i = 1; i<=n; i++) {for(int j = 1; j<=n; j++) {dis[i][j] = maze[i][j] = INF;}}for(int i = 1,a,b; i<=m; i++) {scanf("%d%d%lld",&a,&b,&w);if(w < maze[a][b]) maze[a][b] = maze[b][a] = dis[a][b] = dis[b][a] = w;}ll ans = floyd();if(ans == INF) puts("It's impossible.");else printf("%lld\n",ans);}return 0 ;}

贴一个代码的讲解:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=0xfffffff;
//const int INF=0x3f3f3f3f; 这里用这个就 WA 想不通为啥
//当然WA了。。因为三个INF相加就溢出了啊
int n,m;
int map[110][110],dist[110][110];
void floyd() {int ans=INF;for(int k=1; k<=n; k++) {for(int i=1; i<k; i++) { // 一个环至少要 3个互不相同点,所以保证 k大于 i,i大于 jfor(int j=i+1; j<k; j++) {ans=min(ans,map[i][k]+map[k][j]+dist[i][j]); // 得到从 i点出发再回到 i点的最小环}}for(int i=1; i<=n; i++) {for(int j=1; j<=n; j++) {dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]); // 得到 i,j两点的最短路径}}//注意:求最短路径的循环一定要放在求最小环的循环的下面,这是为了保证 dist[i][j]与 map[i][k]+map[k][j],不会重路//  ans = min ( ans , map[i][k] + map[k][j] + dist[i][j] ) 求最小环式子要求的就是 dist[i][j]中所有的中间点一定小于 k,所以不会重路}if(ans==INF) puts("It's impossible.");else    printf("%d\n",ans);
}
int main() {while(~scanf("%d %d",&n,&m)) {for(int i=1; i<=n; i++) {for(int j=1; j<=n; j++) {dist[i][j]=map[i][j]=(i==j?0:INF);}}int a,b,c;while(m--) {scanf("%d %d %d",&a,&b,&c);if(map[a][b]>c) {dist[a][b]=dist[b][a]=map[a][b]=map[b][a]=c;}}floyd();}return 0;
}

总结:

注意这个无向图中你的距离的初始化  到自身可以初始化成0,也可以初始化成INF,,都可以 看心情就行。。

对于有向图就比较简单了,,可以直接遍历dis[i][i],记录最小值就可以了,。

【HDU - 1599】find the mincost route (Floyd最小环,最短路问题)相关推荐

  1. hdu 1599 find the mincost route(找无向图最小环)(floyd求最小环)

    ps(我到今天才知道Floyd的核心思想是动态规划==) hdu 1599 find the mincost route(找无向图最小环) 注意!这里写成   #define data 0x3f3f3 ...

  2. HDU 1599 find the mincost route

    Floyd可解. 求最短.在路上来回.使用Floyd 而在 三同时不 找出最短.然后更新. 没有推理启动!=INF. 一堆负面结果溢出. #include<cstdio> #include ...

  3. HDU1599 find the mincost route Floyd算法求最小环

    find the mincost route 杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....VK, ...

  4. 杭电1599 find the mincost route

    find the mincost route Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  5. hdu 1599(Floyd求最小环)

    find the mincost route Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  6. Floyd最小环算法

    问题描述: 给你一张无向图,定义环为从i出发到达j然后从j返回i并且所有点都只经过一次(最少为3个点),求所有环当中经过路径最小的环 算法描述: 首先容易想到的是暴力来枚举环,当删除其中一条边ij后再 ...

  7. HDU 1874 畅通工程续 (Dijkstra , Floyd , SPFA, Bellman_Ford 四种算法)

    畅通工程续 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修 ...

  8. HDU 2068 Choose the best route

    http://acm.hdu.edu.cn/showproblem.php?pid=2680 Problem Description One day , Kiki wants to visit one ...

  9. hdu 2680 Choose the best route

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2680 简单最短路问题..... 运行结果: Accepted 2680 265MS 4164K 138 ...

最新文章

  1. 关于工资的三个秘密【转载】
  2. JavaScript 正则表达式
  3. sql 解析字符串添加到临时表中 sql存储过程in 参数输入
  4. Tree Constructer
  5. error 1307 (HY000):Failed to create procedure
  6. 拿了股权的员工能不干活吗?
  7. android7.1 repo,RK3399 Android 7.1 删除repo后编译报错
  8. 前端点击按钮下载图片
  9. 基于matlab深度学习的水果图像识别算法
  10. Mac/Linux/Windos下仿站工具,基于Python的仿站工具,earnp/imitation仿站工具
  11. 网络营销的优势和劣势
  12. js 计算个人所得税
  13. 各种音视频编解码学习详解(7)--微软Windows Media系列
  14. 在 MacOS 上使用 Qt 开发 Android APP
  15. pgsql timestamp without time zone > character varying解决方案
  16. 记录一次node.jsV14升级到V16遇到问题并解决
  17. C++与C#相比,哪个更适合开发大型游戏?
  18. 前端面试必读,助力秋招!
  19. 互联网金融做大数据风控的九种维度
  20. django数据库报错Table 'xxx' doesn't exist或Unknown table 'xxx'

热门文章

  1. python u_对python 命令的-u参数详解
  2. 在java中柱状图代码_我在java中编写了个柱状图,可运行了,我想让柱状图在JSP页面中显示,请问有什么方法么?谢谢。...
  3. new 3ds右摇杆测试软件,电击杂志编辑新3DS评测:防抖3D效果拔群!
  4. typora打开pdf文件提示文件过大_Win7/Win10拷贝到U盘容量足够却提示文件过大的解决方法...
  5. Spring MVC Ajax返回中文乱码
  6. php 405,options跨域请求405
  7. 建筑电气工程设计常用图形和文字符号_怎么看懂建筑电气工程图?用最直白方式,教你基础识图!超级详细...
  8. linux打开另一台linux的图形化,【工具大道】ssh登录Linux服务器,并显示图形化界面...
  9. cmake学习(二)常用变量和常用环境变量
  10. WinCE 字体平滑 ClearType