noip模拟赛 戏
【问题背景】
zhx 和他的妹子(们) 做游戏。
【问题描述】
考虑 N 个人玩一个游戏,任意两个人之间进行一场游戏(共 N*(N-1)/2 场),
且每场一定能分出胜负。
现在, 你需要在其中找到三个人构成“剪刀石头步”局面: 三个人 A, B, C
满足 A 战胜 B, B 战胜 C, C 战胜 A。
【输入格式】
第一行一个正整数 N, 表示参加游戏的人数。
接下来 N 行, 每行 N 个数 0/1,中间没有空格隔开。第 i 行第 j 列数字为 1
表示 i 在游戏中战胜了 j。 所有对角线元素(即第 i 行第 i 个元素) 为 0, 保证数
据合法。
【输出格式】
如果存在三个人构成“剪刀石头布”局面, 输出三个人的编号(从 1 开始)。
如果不存在这样的三个人, 输出一个数-1。
【样例输入】
5
00100
10000
01001
11101
11000
【样例输出】
1 3 2
【数据规模与约定】
分析:今天才知道这种图叫竞赛图,还是第一次接触它.
首先,竞赛图中是没有两元环的,两个点不可能互指.并且竞赛图中一条任意长度的环都可以通过某种变换变成3元环,也就是题目要求的.具体是怎么变换呢?考虑这样一个环:

考虑前3个点1、2、3,如果1、3之间的连边是从3指向1,那么就找到了一个3元环,否则,我们完全可以不考虑2这个点,继续考虑1,3,4,检查1,4的连边,这就和1,2,3这种情况一样了,每次把环的长度-1,由于不存在2元环,所以最后一定可以找到一个三元环.
接下来的任务就是怎么要找到一个任意长度的环.

把dfs走的图看作一棵“树”,如果子节点有边连向祖先,那么就形成了环.将dfs时的vis数组改一下就可以了,vis[i] = 0表示i没有访问过,i=1表示正在访问i或者i的子树,i=2表示i的子树访问完了.如果下一个点vis=1,那么就找到一个环了.维护一个栈,记录一个时间戳,访问到新节点就加入到栈中,子树访问完了就退出来,找到环后就把栈中对应下标的元素一复制就好了.
一个比较重要的思想是把其它的所有不满足条件的情况都给排除掉,一步步接近我们的目标.就好比找3元环,首先证明2元环是不存在的,然后证明大于3元环的一定可以找到3元环,把问题一步步缩小就能找到答案.
#include <map>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int n, a[][], dfs_clock, s[], time[], head[], to[ * ], nextt[ * ], tot = ;
int vis[], top, ans[], cnt; bool flag = false; void add(int x, int y)
{
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++;
} void dfs(int u)
{
if (flag)
return;
vis[u] = ;
s[++top] = u;
time[u] = top;
for (int i = head[u]; i; i = nextt[i])
{
int v = to[i];
if (!vis[v])
dfs(v);
if (vis[v] == )
{
flag = ;
for (int j = time[v]; j <= top; j++)
ans[++cnt] = s[j];
return;
}
}
vis[u] = ;
s[top--] = ;
} int main()
{
scanf("%d", &n);
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
{
scanf("%1d", &a[i][j]);
if (a[i][j])
add(i, j);
}
for (int i = ; i <= n; i++)
if (!vis[i])
{
dfs(i);
if (flag)
break;
}
if (!flag)
printf("-1");
else
{
for (int i = ; i < cnt; i++)
if (a[s[i + ]][s[]])
{
printf("%d %d %d\n", s[], s[i], s[i + ]);
break;
}
} return ;
}
noip模拟赛 戏的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
随机推荐
- bzoj 1689: [Usaco2005 Open] Muddy roads 泥泞的路【贪心】
按左端点排序,贪心的选即可 #include<iostream> #include<cstdio> #include<algorithm> using namesp ...
- python/shell脚本报异常^M: bad interpreter: No such file or directory
问题:在Windows写了一python脚本,上传Linux服务器执行,报异常*****^M: bad interpreter: No such file or directory 原因:window ...
- vue.js学习文档
1.实例化vue对象 new Vue(){ } 2.对象属性 el: 控制的属性 data: 数据存储位置 methods: 方法存储位置 template: 模板样式 computed: 计算属性 ...
- Codeforces 1131 (div 2)
链接:http://codeforces.com/contest/1131 A Sea Battle 利用良心出题人给出的图,不难看出答案为\(2*(h1+h2)+2*max(w1,w2)+4\)由于 ...
- 26 c#类的组合
组合即将各个部分组合在一起.程序设计中就是用已有类的对象来产生新的类. 桌子由木板和钉子组合而成,台灯使用灯座,灯管,电线,接头等拼起来的.我们发现自己周围的很多东西都是由更小的其它东西拼凑构成的,就 ...
- 17 C#中的循环执行 while循环
在编程中有代码的执行主要有三种方式.(1)顺序执行,也就是一条语句一条语句按顺序执行:(2)条件执行,也就是if...else.当某种条件满足时执行一些代码:(3)循环执行,就是当某种条件满足的时候, ...
- Java 8 (8) 默认方法
传统上,Java程序的接口是将相关方法按照预定组合到一起的方式.实现接口的类必须为接口中定义的方法提供一个实现,或者从父类中集成它的实现.但是,一旦类库的设计者需要更新接口,向接口中加入新的方法时候, ...
- Laravel5.1学习笔记23 Eloquent 序列化
Eloquent: Serialization Introduction Basic Usage Hiding Attributes From JSON Appending Values To JSO ...
- [ POI 2010 ] Antisymmetry
\(\\\) \(Description\) 给出一个长度为 \(N\) 的二进制串,定义一个子串是优秀的,当且仅当其正着看,和倒着按位取反后看结果是一样的,求整个串有多少个优秀的子串. \(N\le ...
- Linux文件排序和FASTA文件操作
文件排序 seq: 产生一系列的数字; man seq查看其具体使用.我们这使用seq产生下游分析所用到的输入文件. # 产生从1到10的数,步长为1 $ seq 1 10 1 2 3 4 5 6 7 ...