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学习笔记6 算数语句(sum、mean、min、max函数)
sum:求和 mean:平均值 min:最小值 max:最大值
- base全家桶的安装使用方法
base编码是Binary-to-text encoding的一种实现方法,它可以把二进制数据(含不可打印的字符)编码成可打印字符序列. 本文会不定时收录“base全家桶”:base64.base32 ...
- (八)Activiti之流程变量和局部流程变量
一.流程变量 1.1 概念 如果,当流程走到"学生请假"这个任务节点的时候,此时可以用TaskService设置流程变量,变量值包含请假人.请假时间.请假理由等信息,这些信息存在表 ...
- (七)CXF之与spring整合发布web服务
一.需求分析 用spring发布服务 二.案例 2.1 引入maven依赖 <dependencies> <!-- 添加Spring支持 --> <dependency& ...
- (十二)SpringBoot之Spring-Data-Jpa(一)
一.Spring-Data-Jpa概念 JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate.TopLink等. Spring D ...
- Spring Boot Redis 分布式缓存的使用
一.pom 依赖 <!-- 分布式缓存 --> <dependency> <groupId>org.springframework.boot</groupId ...
- tiny-Spring【1】
Spring框架的两大特性:IOC.AOP 1,IOC特性 IOC:IOC,另外一种说法叫DI(Dependency Injection),即依赖注入.它并不是一种技术实现,而是一种设计思想. 在任何 ...
- 运维MES的日子里
可以看下<工业软件国内与国外差距,越来越小还是越来越大>.<MES技术国内现状与未来发展趋势>及<国际主要MES厂商>,总结来说中国工业是进步的,工业软件也是进步的 ...
- 批量删除checkbox前台后台
<%@ page contentType="text/html;charset=UTF-8" %><%@ include file="/WEB-INF/ ...
- Android 音频播放速率调整实现
最近接触到的一个项目, 有音频播放.切换播放速率和拖动进度到某处播放的需求 ,由于之前只是见过并没有尝试过切换播放速率 , 于是开始调研并最终实现,下面简单记录一下这次的调研过程. MediaPlay ...