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 思路:在保证不产生回 ...
随机推荐
- 在 CentOS 7上Virtualbox+phpVirtualBox完整虚拟化环境部署
一.phpVirtualBox简介 VirtualBox是一套为不同操作系统而设的 x86 虚拟化产品.它是一个机器/硬件的虚拟化产品,功能上与 VMware Server.Parallel ...
- Docker入门实践
Docker是一门很成熟的容器技术,类似虚拟机技术主要用做环境的隔离,方便环境的复制镜像,虚拟机是基于操作系统这一层的,而Docker更加的轻量级,像是“应用”层级的.比如我需要一个MySQL环境.一 ...
- 【C#】C#线程_混合线程的同步构造
目录结构: contents structure [+] 一个简单的混合锁 FCL中的混合锁 ManualResetEventSlim类和SemaphoreSlim类 Monitor类和同步块 Rea ...
- Effective Java 第三版——71. 避免不必要地使用检查异常
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- 偏离中轴的cos半球积分问题
问题: 如果N与n重合,则就是普通的cos半球积分,地球人都知道结果是pi. 对于N与n不重合的一般情况,稍微麻烦一些. 解法1(同济高数课本的方法,参考同济高数第六版第二册“曲面积分”一章): 解法 ...
- linux 命令之top
top命令是显示当前系统正在执行的进程相关信息.包含进程ID.内存占用率等:top命令格式例如以下: top [OPTIONS] OPTIONS: -b 批处理 -c 显示进程的完整名 -I 忽略失效 ...
- ero-configuration Web Application Debugging with Xdebug and PhpStorm
1. Install Xdebug To use Xdebug with PhpStorm for debugging PHP applications, you need to have a PHP ...
- vim几种常用的插入模式
我们来看一下cw这个命令,它是从光标处替换到后一个单词的结尾.比如说我的光标如图: 我的namespace写错了,后面的都对,就可以用cw命令,
- Sql Server 中将由逗号“,”分割的一个字符串转换为一个表集,并应用到 in 条件中
Sql Server 中将由逗号“,”分割的一个字符串,转换为一个表,并应用与 in 条件 ,,) 这样的语句和常用,但是如果in 后面的 1,2,3是变量怎么办呢,一般会用字符串连接的方式构造sql ...
- NaviSoft31.源码开发完成
NaviSoft是作者一人开发完成,从之前的1.0版本,到现在的3.1版本.历经2年时间,开发完成 下面是NaviSoft的源码结构 加QQ群了解更多信息