洛谷题目链接

前言:

这题其实真的不难


回归正题:

我们首先要明白$floyd$的思想,相信你都来做这道水题了,肯定不陌生,简单的手玩后,我们可以发现:

只要有任意一个点只跟非标记点相连的话,是更新不出它到另外的标记点的距离的,并且题目中$k>=2$是很关键的,光说不清楚,举个例子:

$n=5,m=4,k=2$,标记点为$1,5$时:

只需要如下连:

$1-2,1-3,1-4,4-5$,就能够$hack$,为什么呢,我们看到题目中是以标记点为中间点来更新最短距离

那么以$1$为标记点时,能更新出:$2-3,2-4,3-4$的最短距离,而以$5$为标记点时,什么都不能更新出,所以$1-5$的最短距离就不能算出来

那么总结一下连边的规律:

$1$、随便选一个点(下面代码选的是随机的标记点),只跟非标记点相连

$2$、把所有未加入图中的点加入,向除了上面选的点的点连边

$3$、如果边数不满$m$的话,想怎么连就怎么连$qwq$,前提还是不和上面的点相连

那么输出$-1$的情况呢??

$1$、当所有点都是标记点的时候,其实就是一个完整的$floyd$,难道你能$hack$吗,(逃)

$2$、当$m$很大,让你不能够腾出一个点只跟非标记点相连的时候,输出$-1$,具体的话是$(n-1)*(n-2)/2+n-k$,为什么呢?其实是我们要保证一个点只跟非标记点连边,那么连的边数就是$n-k$,那么其他的点随便怎么连,但是最多就是个完全图,也就是$(n-1)*(n-2)/2$了,相加即可

接下来是美滋滋的代码时间~~~

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #define N 307
  6. using namespace std;
  7. int n,m,k,it,it1,line;
  8. bool g[N][N],mark[N],vis[N];
  9. int main()
  10. {
  11. scanf("%d%d%d",&n,&m,&k);
  12. if((k==n)||(m>(n-1)*(n-2)/2+n-k))
  13. {
  14. printf("-1");
  15. return 0;
  16. }
  17. for(int i=1;i<=k;++i)
  18. {
  19. int in;
  20. scanf("%d",&in);
  21. mark[in]=1;
  22. it=in;
  23. }
  24. vis[it]=1;
  25. for(int i=1;i<=n;++i)
  26. g[i][i]=1;
  27. for(int i=1;i<=n;++i)
  28. {
  29. if(i==it||mark[i])
  30. continue;
  31. printf("%d %d\n",i,it);
  32. ++line;
  33. vis[i]=1;
  34. g[i][it]=g[it][i]=1;
  35. it1=i;
  36. if(line==m)
  37. return 0;
  38. }
  39. for(int i=1;i<=n;++i)
  40. {
  41. if(line==m)
  42. return 0;
  43. if(vis[i])
  44. continue;
  45. printf("%d %d\n",i,it1);
  46. ++line;
  47. g[i][it1]=g[it1][i]=1;
  48. vis[i]=1;
  49. }
  50. for(int i=1;i<=n;++i)
  51. {
  52. if(line==m)
  53. return 0;
  54. if(i==it)
  55. continue;
  56. for(int j=1;j<=n;++j)
  57. {
  58. if(j==it||g[i][j])
  59. continue;
  60. if(line==m)
  61. return 0;
  62. printf("%d %d\n",i,j);
  63. g[i][j]=g[j][i]=1;
  64. ++line;
  65. }
  66. }
  67. return 0;
  68. }

  

CF350E Wrong Floyd的更多相关文章

  1. CF350E 【Wrong Floyd】

    Description 给定n个点,m条边,k个标记点,hack掉给出的程序. Solution 先考虑不可能hack掉的情况.当所有点都是标记点的时候肯定不能hack掉,也就是\(n=k\).还有就 ...

  2. floyd算法学习笔记

    算法思路 路径矩阵 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1):又 ...

  3. 最短路(Floyd)

    关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...

  4. 最短路径之Floyd算法

    Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floy ...

  5. UVALive 4431 Fruit Weights --floyd,差分约束?

    题意: 给出一些关系用aX <= bY表示, 最后查询aX 和 bY的关系,是>=,==,<=,还是不能确定,还是出现了矛盾. 解法:对每一个关系其实都可以建一条X->Y的边, ...

  6. 洛谷P1119 灾后重建[Floyd]

    题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...

  7. UVA10048 Audiophobia[Floyd变形]

    UVA - 10048 Audiophobia Consider yourself lucky! Consider yourself lucky to be still breathing and h ...

  8. 最短路径—Dijkstra算法和Floyd算法

    原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...

  9. 最短路径问题——floyd算法

    floyd算法和之前讲的bellman算法.dijkstra算法最大的不同在于它所处理的终于不再是单源问题了,floyd可以解决任何点到点之间的最短路径问题,个人觉得floyd是最简单最好用的一种算法 ...

随机推荐

  1. 编码方式之ASCII、ANSI、Unicode概述

    1.ASCII ASCII全称(American Standard Code for Information Interchange)美国信息交换标准代码,在计算机内部中8位二进制位组成1个字节(8( ...

  2. 剑指Offer(4)——替换空格

    题目: 请实现一个函数,把字符串中的每个空格替换成"%20".例如输入“We are happy.”,则输出“We%20are%20happy.”. 思路: 如果按照顺序从前往后依 ...

  3. 怎样用sql语句复制表table1到表table2的同时复制主键

    原文:怎样用sql语句复制表table1到表table2的同时复制主键 在从table1表复制到table2的时候,我们会用语句: select * into table2 from table1 但 ...

  4. C#多线程的简单理解

    一.CLR线程池基础 创建和销毁线程是一个昂贵的操作,所以CLR管理了一个线程池(thread pool),可以将线程池看成一个黑盒. CLR初始化时,线程池中是没有线程的.线程的初始化与其他线程一样 ...

  5. call、apply、bind一直是不求甚解!

    一直感觉代码中有call和apply就很高大上(看不懂),但是都草草略过,今天非要弄明白!以前总是死记硬背:call.apply.bind 都是用来修改函数中的this,传参时,call是一个个传参, ...

  6. Docker启动Elasticsearch报错java.nio.file.AccessDeniedException

    报错信息 Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes 问题分析 表面上是说容 ...

  7. 提高前端开发效率的N种方法

    一.使用固定的html模板和css公共样式 事先把模板建好,每次需要用的时候直接拿来就行,不再需要为浏览器兼容问题考虑太多时间 这里我整理了一套,希望对大家有帮助:http://www.cnblogs ...

  8. stm32 PWM

    脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术 高级定时器可以同时产生多达7路的PWM输出 而通用定时器也能同时产生多达4路的PWM输出 脉冲宽度调制模式可以产生一个由T ...

  9. Flutter——BottomNavigationBar组件(底部导航栏组件)

    BottomNavigationBar常用的属性: 属性名 说明 items List<BottomNavigationBarItem> 底部导航条按钮集合 iconSize icon c ...

  10. c多线程不加锁demo

    // // Created by gxf on 2019/12/13. // #include <stdio.h> #include <stdlib.h> #include & ...