题目链接

题意:给n个数,要求这n个数字小的尽量放到前面,求一个最小的。

给一个矩阵s[i][j]==1,表示位置 i 的数字可以和 位置 j 的数字交换。

分析:

刚开始用的是3个循环,每次都找一个能直接连接的最小的放到前面,过了小数据,快结束的时候被hack了。

其实不应该这么做,因为还有间接相连提前交换的最小的解。 正解是用floyd,先预先处理出来同一堆,也就是

直接和间接相连的所有 标记,然后根据标记从前向后找最小的。

这个题也可以用并查集做,当时想到了,感觉B题的程度应该考虑暴力神马的,结果随便写了一下也没对。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 #define LL __int64
 8 const int maxn = 1e3 + 10;
 9 using namespace std;
10 char s[maxn][maxn];
11 int a[maxn], f[maxn][maxn];
12
13 int main()
14 {
15     int i, j, n, k;
16     while(~scanf("%d", &n))
17     {
18         memset(f, 0, sizeof(f));
19         for(i = 0; i < n; i++)
20         scanf("%d", &a[i]);
21         for(i = 0; i < n; i++)
22         {
23             getchar();
24             scanf("%s", s[i]);
25             for(j = 0; j < n; j++)
26             if(s[i][j]=='1')
27             f[i][j] = 1;
28         }
29
30         for(k = 0; k < n; k++)
31         for(i = 0; i < n; i++)
32         for(j = 0; j < n; j++)
33             if(f[i][k] && f[k][j])
34                 f[i][j] = 1;
35
36         for(i = 0; i < n; i++)
37         for(j = i+1; j < n; j++)
38         if(f[i][j] && a[i]>a[j])
39          swap(a[i], a[j]);
40
41         for(i = 0; i < n; i++)
42         {
43             if(i == n-1) cout<<a[i]<<endl;
44             else printf("%d ", a[i]);
45         }
46     }
47     return 0;
48 }

转载于:https://www.cnblogs.com/bfshm/p/4196925.html

Good Bye 2014 B. New Year Permutation(floyd )相关推荐

  1. 弗洛伊德算法(Floyd)简介

    弗洛伊德算法(Floyd)简介 Floyd算法适用于解决求最短路径问题,相比于Digkstra算法思路更加简单,更容易理解,但是效率会明显低很多,可以作为初步学习的一种方法. 目录 弗洛伊德算法(Fl ...

  2. 【算法】弗洛伊德(Floyd)算法

    这个算法主要要弄懂三个循环的顺序关系. 弗洛伊德(Floyd)算法过程: 1.用D[v][w]记录每一对顶点的最短距离. 2.依次扫描每一个点,并以其为基点再遍历所有每一对顶点D[][]的值,看看是否 ...

  3. 七、最短路径——弗洛伊德(Floyd)算法

    为了能讲明白弗洛伊德(Floyd)算法的精妙所在,我们先来看最简单的案例.下图是一个最简单的3个顶点连通网图. 我们先定义两个二维数组D[3][3]和P[3][3],D代表顶点到顶点的最短路径权值和的 ...

  4. 【数据结构】图—弗洛伊德(Floyd)算法

    前言 上文介绍了迪杰斯特拉(Dijkstra)算法,计算网图的某个源点到其余各个顶点的最短路径问题(边权值为非负值),本文介绍另一个求最短路径的算法--弗洛伊德算法,它是计算所有顶点到所有顶点的最短路 ...

  5. 弗洛伊德(Floyd)算法之两点之间的最短距离问题

    1.概述 (1)与迪杰斯特拉(Dijkstra)算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,该算法 名称以创始人之一.1978 年图灵奖获得者.斯坦福大学计 ...

  6. 最短路径之弗洛伊德算法(Floyd)——动态规划

    弗洛伊德算法(Floyd)主要针对多源最短路径,且可以解决路径中有负权的情况(不包含负权回路),但是迪杰斯特拉算法只能解决正权值的单源最短路径(可以迭代多次求多源). 1.弗洛伊德算法的基本思想 弗洛 ...

  7. 算法系列——弗洛伊德算法(Floyd)

    本系列旨在用简单的人话讲解算法,尽可能避免晦涩的定义,读者可以短时间内理解算法原理及应用细节.我在努力! 本篇文章编程语言为Python,供参考. 弗洛伊德算法(Floyd) 典型最短路径算法.用于计 ...

  8. 大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)

    6 最短路径   最短路径,对于图来说,是两顶点之间经过的边数最少的路径:对于网来说,是指两顶点之间经过的边上权值之和最小的路径.路径上第一个顶点为源点,最后一个顶点是终点. 6.1 迪杰斯特拉(Di ...

  9. 数据结构——图——弗洛伊德(Floyd)算法

    数据结构--图--弗洛伊德(Floyd)算法 为了能讲明白弗洛伊德(Flbyd)算法的精妙所在,我们先来看最简单的案例.图7-7-12的左图是一个最简单的3个顶点连通网图. 我们先定义两个二维数组D[ ...

最新文章

  1. C语言易错题--将一个整数转换为六进制打印
  2. python代码打印二叉树某一特定层的节点
  3. 前台特效(9)无限极分类折叠菜单
  4. DataGrid多行数据的展示和编辑(6)
  5. js 获取json数组里面数组的长度
  6. git提交到github总是要输入密码_GitHub不为人知的秘密
  7. linux系统修改为静态IP地址
  8. 6 月 4 日!苹果 WWDC 2018 或重点推出 iOS 12 系统
  9. 【Fastboot】给android刷整个系统和系统某个单独模块的方法
  10. 机器人布罩_机器人防护罩的主要作用是什么?
  11. 机器人编程和python的区别_乐高机器人编程和计算机编程的区别
  12. UML (统一建模语言) 各种图总结
  13. 马克思主义基本原理习题册
  14. 模拟行走机器人-c语言
  15. oeasy教您玩转vim - 005 - # 程序本质
  16. 数字选择器NumberPicker使用教程
  17. 【281期】面试官问:淘宝七天自动确认收货,可以怎么实现?
  18. 无法启动计算机的病毒是,电脑病毒导致系统中的exe文件无法打开如何解决
  19. mysql 未找到 WinSxS_清理WinSxs释放 Win7 C盘所占的空间
  20. 论文翻译 | TOOD:《TOOD: Task-aligned One-stage Object Detection》详细解读

热门文章

  1. Python+OpenCV 图像处理系列(7)—— 图像色彩空间及转换
  2. Redis 笔记(06)— set 类型(向集合添加元素、获取集合元素个数、判断集合中是否包含某个元素、删除给定元素、返回集合中所有元素、计算集合的交集、并集、差集)
  3. 一段神奇的c代码错误分析
  4. python中的raw string的使用
  5. ionic4中实现时间线
  6. LeetCode简单题之位1的个数
  7. Rust和C / C ++的跨语言链接时间优化LTO
  8. MEMS传感器作为变革的驱动力
  9. CVPR2020:点云分类的自动放大框架PointAugment
  10. 深度学习调参体验(一)