CF350E Wrong Floyd
前言:
这题其实真的不难
回归正题:
我们首先要明白$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$了,相加即可
接下来是美滋滋的代码时间~~~
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 307
using namespace std;
int n,m,k,it,it1,line;
bool g[N][N],mark[N],vis[N];
int main()
{
scanf("%d%d%d",&n,&m,&k);
if((k==n)||(m>(n-1)*(n-2)/2+n-k))
{
printf("-1");
return 0;
}
for(int i=1;i<=k;++i)
{
int in;
scanf("%d",&in);
mark[in]=1;
it=in;
}
vis[it]=1;
for(int i=1;i<=n;++i)
g[i][i]=1;
for(int i=1;i<=n;++i)
{
if(i==it||mark[i])
continue;
printf("%d %d\n",i,it);
++line;
vis[i]=1;
g[i][it]=g[it][i]=1;
it1=i;
if(line==m)
return 0;
}
for(int i=1;i<=n;++i)
{
if(line==m)
return 0;
if(vis[i])
continue;
printf("%d %d\n",i,it1);
++line;
g[i][it1]=g[it1][i]=1;
vis[i]=1;
}
for(int i=1;i<=n;++i)
{
if(line==m)
return 0;
if(i==it)
continue;
for(int j=1;j<=n;++j)
{
if(j==it||g[i][j])
continue;
if(line==m)
return 0;
printf("%d %d\n",i,j);
g[i][j]=g[j][i]=1;
++line;
}
}
return 0;
}
CF350E Wrong Floyd的更多相关文章
- CF350E 【Wrong Floyd】
Description 给定n个点,m条边,k个标记点,hack掉给出的程序. Solution 先考虑不可能hack掉的情况.当所有点都是标记点的时候肯定不能hack掉,也就是\(n=k\).还有就 ...
- floyd算法学习笔记
算法思路 路径矩阵 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1):又 ...
- 最短路(Floyd)
关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...
- 最短路径之Floyd算法
Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floy ...
- UVALive 4431 Fruit Weights --floyd,差分约束?
题意: 给出一些关系用aX <= bY表示, 最后查询aX 和 bY的关系,是>=,==,<=,还是不能确定,还是出现了矛盾. 解法:对每一个关系其实都可以建一条X->Y的边, ...
- 洛谷P1119 灾后重建[Floyd]
题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...
- UVA10048 Audiophobia[Floyd变形]
UVA - 10048 Audiophobia Consider yourself lucky! Consider yourself lucky to be still breathing and h ...
- 最短路径—Dijkstra算法和Floyd算法
原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...
- 最短路径问题——floyd算法
floyd算法和之前讲的bellman算法.dijkstra算法最大的不同在于它所处理的终于不再是单源问题了,floyd可以解决任何点到点之间的最短路径问题,个人觉得floyd是最简单最好用的一种算法 ...
随机推荐
- SAS学习笔记37 宏程序中parmbuff选项
该选项用于指定宏可以接受可变参数列表,而且参数值保存在SYSPBUFF宏变量中.parmbuff的参数价值,其实就是每次执行宏程序时,可以指定不同数量的参数值,这些宏参数被保存在&syspbu ...
- Lieges of Legendre CodeForces - 603C (博弈论,SG找规律)
大意: 给定$n$堆石子, 两人轮流操作, 每次操作两种选择 $(1)$任选非空堆拿走一个石子 $(2)$任选石子数为$2x(x>0)$的一堆, 替换为$k$堆$x$个石子. ($k$给定) 最 ...
- vim编辑器中的替换(转)
转1:https://www.cnblogs.com/david-wei0810/p/6385988.html 转2:https://blog.csdn.net/doubleface999/artic ...
- css 清除浮动 & BFC
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 文档流的概念:html 中 block 块元素默认是单独占据一行的,从上到下排列,也就是我们说的文档流. ...
- (三)springmvc之注解的基本使用
一.@Controller @Controller 标记一个类是Controller 二.RequestMapping 地址映射 2.1 Value的操作. 注解在类上面 (父) ...
- win7 bios引导启动Ubuntu
用easyBCD修改系统启动项更改 1.安装easyBCD后打开,点击“Add New Entry”>选择Linux/BSD:具体设置如图,Type选择GRUB2,Name自己随便写,笔者写的是 ...
- [学习笔记]pb_ds库
前言 其实我很早开始就用pb_ds库了,用起来确实方便.但最近感觉还是对这个了解颇少,还是来补一下 话说有人会忘记头文件,其实这有个伎俩,找到电脑上的g++文件夹.Ubuntu应该在etc中,Wind ...
- freemarker循环、下标及判断
一.freemarker中list循环使用非常频繁,下面介绍lfreemarker中list简单的用法 1.在freemarker中遍历list数组使用list指令:<#list sequenc ...
- 解决tensorflow 调用bug Running model failed:Invalid argument: NodeDef mentions attr 'dilations' not in Op<name=Conv2D; signature=input:T, filter:T ->
将tensorflow C++ 版本更新为何训练版本一致即可
- VBA if语句
一个if语句由一个布尔表达式和一个或多个语句组成.如果条件被评估为True,则执行If条件块下的语句.如果条件被评估为False,则执行If循环块后面的语句. 语法 以下是VBScript中的If语句 ...