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 思路:在保证不产生回 ...
随机推荐
- 在windows命令行批量ping局域网内IP
参考了博客园Alfred Zhao的文章<Windows平台ping测试局域网所有在用IP> 在cmd命令行运行如下命令即可: ,,) -w .%i | find "回复&quo ...
- shell脚本启动语法错误syntax error near unexpected token '{
执行shell脚本时失败,报语法错误,但脚本内容检查正常 原因为该脚本是在非Linux系统下编辑之后放到系统执行的,文件模式类型非Linux系统匹配的模式类型. 查看文件的模式类型 显示文件的模式类型 ...
- .NET 同步与异步 之 线程安全的集合 (十一)
本随笔续接:.NET 同步与异步 之 警惕闭包(十) 无论之前说的锁.原子操作 还是 警惕闭包,都是为安全保驾护航,本篇随笔继续安全方面的主题:线程安全的集合. 先看一下命名空间:System.Col ...
- 【Nginx】Nginx在Linux下的入门介绍
Nginx的安装 下载.解压 从Nginx下载安装包,我下的是nginx-1.8.0.tar.gz.解压后的目录为: [root@blog third_package]# tar -zxf nginx ...
- 【Java基础】Java注解简单入门
注解简单来说就是配置,是特别的配置,之前常用的配置文件,可以用注解替换.然后通过反射去获取注解的信息. 如何定义一个注解 你在IDE中新建一个注解定义,是这样的结构的: package com.nic ...
- [转]$.post() 和 $.get() 如何同步请求
原文地址:https://blog.csdn.net/sunnyzyq/article/details/78730894 由于$.post() 和 $.get() 默认是 异步请求,如果需要同步请求, ...
- [转]spring MultipartFile 转 File
原文地址:https://www.jianshu.com/p/6cf99d39e170 File.createTempFile(String prefix, String suffix); 创建一个临 ...
- windows下JDK环境配置与Android SDK环境配置
一.JDK环境配置1.配置变量名:JAVA_HOME变量值:jdk安装的绝对路径. 变量名:Path(在系统变量中找到并选中Path点击下面的编辑按钮,不要删除原本变量值中的任何一个字母,在这个变量值 ...
- 在Linux添加定时任务删除5天前的日志文件
利用shell脚本自动清理,脚本如下 1.删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 实例命令: fin ...
- QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类
一般情况下信号槽直接连接方式不会出现问题,但是如果信号与槽在不同线程或Qt::QueuedConnection方式连接,可能会在连接期间报以下类似问题,如: QObject::connect: Can ...