为了看下自己学会没

例题:

杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....VK,V1,那么必须满足K>2,就是说至除了出发点以外至少要经过2个其他不同的景区,而且不能重复经过同一个景区。现在8600需要你帮他找一条这样的路线,并且花费越少越好。

输入:第一行是2个整数N和M(N <= 100, M <= 1000),代表景区的个数和道路的条数。
接下来的M行里,每行包括3个整数a,b,c.代表a和b之间有一条通路,并且需要花费c元(c <= 100)。

输出:对于每个测试实例,如果能找到这样一条路线的话,输出花费的最小值。如果找不到的话,输出"It's impossible.".

sample:

输入

3 3
1 2 1
2 3 1
1 3 1
3 3
1 2 1
1 2 3
2 3 1

输出

3

It's impossible.

题目中要求“k>2”为我们排除了只有两个顶点无法成环的情况,即可以将问题简化为形成环路、顶点数大于等于三、不重复经过同一顶点的 弗洛伊德算法求无向图最小权值环路问题。

实现这个算法我们需要定义两个二维数组,其中一个通过三重循环更新存储顶点间的最短路径,另一个存储原始权值数据。

核心思想

假设有vn个顶点。三重循环最外层是中间顶点的序号(由0-n,为了遍历所有顶点作为中间顶点时的情况)

中层和内层分别是起点(0-中间顶点)和终点(起点序号+1-中间顶点,为了保证中间顶点不被包含在已经更新过的最小路径集中,且不会由自己出发走向自己还有a[i][j]、a[j][i]这种重复比较的情况)的序号,

第一个内部二重循环比较已有的ans值(所求最小环权值和)和原始表中起点终点距离与更新后的最短路径距离之和(循环条件能够保证这个最短路径集中不含外层循环当前所取中间节点序号值

)(刚好构成一个环路)的大小,第二个二重循环更新将当前中间节点纳入最短路径集后的最短路径

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
const int MAXN = 10;
const int N = 10000;
typedef struct graph
{int nov,noe;int m[MAXN][MAXN];} G;int priv[MAXN][MAXN];// 中间节点 int cost[MAXN][MAXN]; //花费 void Floyd(graph G,int p[MAXN][MAXN],int c[MAXN][MAXN])
{int v,w,k;int ans = N;for(v=0;v<G.nov;v++)  //初始化 for(w=0;w<G.nov;w++){   p[v][w] = w;c[v][w] = G.m[v][w];  }for(k=0;k<G.nov;k++){for(v=0;v<k;v++)for(w=v+1;w<kw++){ans = ans<(c[v][w]+G.m[v][k]+G.m[k][w])?ans:(c[v][w]+G.m[v][k]+G.m[k][w]);}for(v=0;v<G.nov;v++)for(w=0;w<G.nov;w++){if(c[v][w]>c[v][k]+c[k][w]){c[v][w]=c[v][k]+c[k][w];p[v][w]=p[v][k];}}}                                   //弗洛伊德算法 if(ans == N)printf("It's impossible"); else printf("%d",ans);} int main(){int v,w,i;graph G;scanf("%d%d",&G.nov,&G.noe);      for(v=0;v<G.nov;v++)  //初始化 for(w=0;w<G.nov;w++){   if(v==w)  G.m[v][w] = 0;else         G.m[v][w] = N;  }for(i=0;i<G.noe;i++)            {   scanf("%d %d",&v,&w);  scanf("%d",&G.m[v-1][w-1]);G.m[w-1][v-1]=G.m[v-1][w-1] ; }Floyd(G,priv,cost);return 0;  }

弗洛伊德求最小简单环相关推荐

  1. 双联通分量求简单环(Educational Codeforces Round 42: F. Simple Cycles Edges)

    题意: n个点m条边的无向图,问有哪些边在一个简单环上,按顺序输出这些边的编号 思路: 对于无向图求出每个双联通分量,对于每个双联通分量,如果点的个数==边的个数,那么这个双联通分量就是个简单环,输出 ...

  2. UVA11889(给出lcm(A,B)=C中的AC求最小的B)

    题意:      给出最小公倍数LCM(A,B) = C中的A,C求最小的B. 思路:       lcm=(a*b)/gcd,把等号两侧同时除以a得到lcm/a=b/gcd左侧是已知的,右侧的gcd ...

  3. 试除法求最小N个素数之二

    Trial division 试除法求最小N个素数是一个经典的算法. 这个算法不同于前一个版本<试除法求最小N个素数>的方法,也是一个比较快速的方法. 这个算法考虑以下两点: 1.偶数中只 ...

  4. 一种更简单的求最小平方均值函数(MSE)的方法 -- 梯度下降法。

    在上一篇博客中我们通过解析解法算出来了 但是上面公式中的对称阵是N维乘以N维的,复杂度为O(n*n*n),虽然很精准但是很慢. 为此我们引入梯度下降法 我们首先大致画出MSE的图像,MSE是一个开口向 ...

  5. hdu3491 最小点割集(无向图求最小点割集通用方法)

    无向图最小点割集,确定起点S,终点T.每个点都有自己的点权值vi,求最小点权和的割点集,使得S无法到达T. 解法:将每个点拆分为两个点v和v',之间的权值为vi(单向边),将原图中的每条边赋权值为IN ...

  6. 求最小码距 (10 分)

    求最小码距 (10 分) 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 题目描述 计算机组成原理老师给小明出了一道求最小码距的题目, 有以下由1个字节组成的合法编码集{0xA ...

  7. 7-3 求最小码距 (10 分)

    计算机组成原理老师给小明出了一道求最小码距的题目, 有以下由1个字节组成的合法编码集{0xA9,0xC7,0xDF,0xBE},该编码集的最小码距是__ 小明知道码距,也知道最小码距的概念.码距是指 ...

  8. 7-3 求最小码距(完整版) (10 分)

    7-3 求最小码距(完整版) (10 分) 计算机组成原理老师给小明出了一道求最小码距的题目, 有以下由1个字节组成的合法编码集{0xA9,0xC7,0xDF,0xBE},该编码集的最小码距是__小明 ...

  9. 利用Kuhn-Munkras算法求最小权值匹配

    本文参考博客: http://blog.csdn.net/zhangpinghao/article/details/12242823(代码参考该博客) http://philoscience.itey ...

最新文章

  1. The Six Best Practices(4~6)
  2. HDU - 5637 Transform (思维、bfs预处理)
  3. Linux下动态链接库调用
  4. sharepoint ECMA
  5. 布林通道参数用20还是26_“布林强盗”量化交易系统,它真正厉害的地方是在这里...
  6. $.extend()和(function($){….})(jQuery)
  7. DNS全局负载均衡(GSLB)基本原理
  8. vue仿微博评论回复_Vue之 3.0升级
  9. JQuery常用方法一览【转】
  10. Vue报错:Uncaught TypeError: Cannot assign to read only property ‘exports‘ of object 的解决方法
  11. python语言入门t_Python基础学习
  12. mysql分表的原则_分库分表原则 总结
  13. Java使用WebService调用远程服务wsdl的方法,搭建一个demo,简单易用的教程
  14. 9个最适合Elementor的免费主题【官方推荐】
  15. 华为eNSP学习笔记 | 命令行配置视图
  16. pta 电话聊天狂人(map)
  17. linux commen cmd
  18. 这个开源项目绝绝子,一键生成好玩的矢量风格头像!
  19. 计算机论文一千五,1.论文字数不够,正文要五千字,至少增加1000,但不要抄袭.DOC...
  20. 拼多多收php吗_php调用拼多多的接口

热门文章

  1. 微信HTML5页面设计建议
  2. IP协议详解之头部结构
  3. Arch linux使用yay安装软件时有效性检查错误
  4. ppt画图存为eps格式
  5. 数据库应用之(教育)
  6. 商丘学院计算机考研,商丘学院院校简介_商丘学院研究生院 - 中国考研网
  7. 什么是同城商超配送系统
  8. 何为ISM频段?ISM频段主要频率有哪些? 1
  9. Android Studio如何更改app名称
  10. SAP 各种适配器配器