Gym 101873D - Pants On Fire - [warshall算法求传递闭包]
题目链接:http://codeforces.com/gym/101873/problem/D
题意:
给出 $n$ 个事实,表述为 "XXX are worse than YYY"。再给出 $m$ 个某人说的话,也是表述为 "XXX are worse than YYY",对于每句话都要判断是否正确:
如果正确,输出 "Fact";如果错误,输出 "Alternative Fact";如果无法判断,输出 "Pants on Fire"。
题解:
本题是求传递闭包。
关于传递闭包,例如有 $A=\{0,1,2\}$,基于 $A$ 的关系集合 $R=\{<0,0>,<1,0>,<2,2>,<1,2>,<2,1>\}$,
而 $R$ 的传递闭包 $t(R) = \{<0,0>,<1,0>,<2,2>,<2,1>,<1,2>,<1,1>,<2,0>\}$。
学过离散数学都知道,可以用warshall算法求传递闭包:
首先用邻接矩阵 $A$ 表示关系。
(1)置新矩阵 $A=M$;
(2)令 $j=1$;
(3)对所有 $i$ 如果 $A[i,j] = 1$,则对 $k = 1,2,\cdots,n$,$A[i,k] = A[i,k] or A[j,k]$;
(4)$j+=1$(i是行,j是列);
(5)如果 $j \le n$,则转到步骤(3),否则算法结束。
for(int j=;j<=tot;j++) {
for(int i=;i<=tot;i++) {
if(!edge[i][j]) continue;
for(int k=;k<=tot;k++) {
edge[i][k]|=edge[j][k];
}
}
}
观察一下上述代码,可改成:
for(int j=;j<=tot;j++) {
for(int i=;i<=tot;i++) {
for(int k=;k<=tot;k++) {
edge[i][k]|=edge[i][j]&edge[j][k];
}
}
}
然后你就会发现,warshall算法和floyd算法异曲同工,然后你就会发现floyd算法全名是floyd-warshall算法。(QWQ)
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=+;
int n,m;
int edge[maxn][maxn];
int tot;
map<string,int> mp;
int main()
{
cin>>n>>m;
tot=;
mp.clear();
memset(edge,,sizeof(edge));
for(int i=,u,v;i<=n;i++)
{
string s;
cin>>s;
if(mp.count(s)) u=mp[s];
else u=mp[s]=++tot;
cin>>s; cin>>s; cin>>s;
cin>>s;
if(mp.count(s)) v=mp[s];
else v=mp[s]=++tot;
edge[u][v]=;
}
for(int j=;j<=tot;j++) {
for(int i=;i<=tot;i++) {
for(int k=;k<=tot;k++) {
edge[i][k]|=edge[i][j]&edge[j][k];
}
}
}
for(int i=,u,v;i<=m;i++)
{
string s;
cin>>s;
u=mp[s];
cin>>s; cin>>s; cin>>s;
cin>>s;
v=mp[s];
if(edge[u][v]) printf("Fact\n");
else if(edge[v][u]) printf("Alternative Fact\n");
else printf("Pants on Fire\n");
}
}
Gym 101873D - Pants On Fire - [warshall算法求传递闭包]的更多相关文章
- Warshall算法求传递闭包及具体实现
传递闭包 在数学中,在集合 X 上的二元关系 R 的传递闭包是包含 R 的 X 上的最小的传递关系. 例如,如果 X 是(生或死)人的集合而 R 是关系“为父子”,则 R 的传递闭包是关系“x 是 y ...
- POJ 2253 Frogger(warshall算法)
题意:湖中有很多石头,两只青蛙分别位于两块石头上.其中一只青蛙要经过一系列的跳跃,先跳到其他石头上,最后跳到另一只青蛙那里.目的是求出所有路径中最大变长的最小值(就是在到达目的地的路径中,找出青蛙需要 ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- poj 3565 uva 1411 Ants KM算法求最小权
由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...
- HDU-1233 还是畅通工程 (prim 算法求最小生成树)
prim 算法求最小生成树 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- Dijkstra算法求单源最短路径
Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...
- ZOJ Problem - 2588 Burning Bridges tarjan算法求割边
题意:求无向图的割边. 思路:tarjan算法求割边,访问到一个点,如果这个点的low值比它的dfn值大,它就是割边,直接ans++(之所以可以直接ans++,是因为他与割点不同,每条边只访问了一遍) ...
- HDU 1269 迷宫城堡 tarjan算法求强连通分量
基础模板题,应用tarjan算法求有向图的强连通分量,tarjan在此处的实现方法为:使用栈储存已经访问过的点,当访问的点离开dfs的时候,判断这个点的low值是否等于它的出生日期dfn值,如果相等, ...
- Kruskal和Prim算法求最小生成树
Kruskal算法求最小生成树 测试数据: 5 6 0 1 5 0 2 3 1 2 4 2 4 2 2 3 1 1 4 1 输出: 2 3 1 1 4 1 2 4 2 0 2 3 思路:在保证不产生回 ...
随机推荐
- 1154:LETTERS
题目链接http://bailian.openjudge.cn/practice/1154/ 总时间限制: 1000ms 内存限制: 65536kB 描述 A single-player game i ...
- Community宣言
Community宣言 一个幽灵,共产主义的幽灵,在欧洲游荡.为了对这个幽灵进行神圣的围剿,旧欧洲的一切势力,教皇和沙皇.梅特涅和基佐.法国的激进派和德国的警察,都联合起来了. 有哪一个反对党不被它的 ...
- [转]awsome-python
原文链接 Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Pytho ...
- Windows IIS 服务器配置HTTPS启用TLS协议。
好消息, 程序员专用早餐机.和掌柜说 ideaam,可以节省20元. 点击链接 或復·制这段描述¥k3MbbVKccMU¥后到淘♂寳♀ Windows IIS 服务器配置HTTPS启用TLS协议. ...
- idea maven 集成多模块 module
首先第一步创建 顶级项目 也就是父项目 在创面那部中 不管你勾不勾 create from 那个选项 都无所谓,最终创建的项目要全删的 ,只保留pom.xml 父项目结构 接下来 创建子项目 也是 ...
- ShiftRows方法简介
ShiftRows 是HSSFSheet工作薄的方法 ShiftRows(int startRow,int endRow,int n)参数介绍:startRow:开始行endRow:末尾行n:移动n行 ...
- Linux 文件删除原理_009
***了解Linux文件删除原理先了解一下文件inode索引节点,每个文件在Linux系统里都有唯一的索引节点(身份证号) inode.如果文件存在硬链接,那这个文件和这个文件的硬链接的inode是相 ...
- Python学习笔记——发邮件
参考:Python3实现163邮箱SMTP发送邮件 1.首先需要注册一个网易的邮箱,开启smtp服务,并使用其授权码 2.发送邮件的Python脚本 #!/usr/bin/python # -*- c ...
- linux中,history命令,显示时间戳?操作人?IP地址?
需求描述: 在linux环境中,有的时候为了审计的需要,要记录谁什么时间从什么IP登录,执行了什么命令,bash的history命令就能够记录这些信息,但是在默认的情况下,是不记录时间的,所以呢,在这 ...
- SQL 问题记录
今天在处理SQL的时候遇到几个问题: 1.如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中 select distinct id from 收费站 ...